LL库-I2C
- Fang XS.
- 1452512966@qq.com
- 如果有错误,希望被指出
前言
I2C
- 以I2C1 polling模式为例:
- 在I2C初始化最后添加:
LL_I2C_Enable(I2C1);
uint8_t I2C_read_reg_8bit(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg){
uint8_t read_data;
SlaveAddr_IC = SlaveAddr_IC<<1;
uint32_t counter = 0;
while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
counter++;
if( counter == 25000){
Error_Handler();
return 0xFF;
}
}
LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 1,LL_I2C_MODE_SOFTEND,LL_I2C_GENERATE_START_WRITE );
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
LL_I2C_TransmitData8(I2Cx, addr_reg);
counter=0;
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
counter++;
if( counter == 25000){
LL_I2C_ClearFlag_TXE(I2Cx);
Error_Handler();
return 0xFF;
}
}
while(LL_I2C_IsActiveFlag_TC(I2Cx)==RESET);
LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC, LL_I2C_ADDRSLAVE_7BIT, 1, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ);
while(LL_I2C_IsActiveFlag_RXNE(I2Cx)==RESET);
read_data = LL_I2C_ReceiveData8(I2Cx);
while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);
LL_I2C_ClearFlag_STOP(I2Cx);
return read_data;
}
uint16_t I2C_read_reg_16bit(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg){
uint8_t read_data[2], i=0;
SlaveAddr_IC = SlaveAddr_IC<<1;
uint32_t counter = 0;
while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
counter++;
if( counter == 25000 ){
Error_Handler();
return 0xFF;
}
}
LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 1,LL_I2C_MODE_SOFTEND,LL_I2C_GENERATE_START_WRITE );
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
LL_I2C_TransmitData8(I2Cx, addr_reg);
counter=0;
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
counter++;
if( counter == 25000 ){
LL_I2C_ClearFlag_TXE(I2Cx);
Error_Handler();
return 0xFF;
}
}
while(LL_I2C_IsActiveFlag_TC(I2Cx)==RESET);
LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC, LL_I2C_ADDRSLAVE_7BIT, 2, LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_READ);
while(!LL_I2C_IsActiveFlag_STOP(I2Cx)){
if(LL_I2C_IsActiveFlag_RXNE(I2Cx)){
read_data[i] = LL_I2C_ReceiveData8(I2Cx);
i++;
}
}
LL_I2C_ClearFlag_STOP(I2Cx);
return (read_data[0]<<8) | read_data[1];
}
ErrorStatus I2C_write_reg_8bit(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg, uint8_t value){
SlaveAddr_IC = SlaveAddr_IC<<1;
uint32_t counter = 0;
while(LL_I2C_IsActiveFlag_BUSY(I2Cx) == SET){
counter++;
if( counter == 25000 ) {
Error_Handler();
return ERROR;
}
}
LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 2,LL_I2C_MODE_AUTOEND,LL_I2C_GENERATE_START_WRITE );
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
LL_I2C_TransmitData8(I2Cx, addr_reg);
counter=0;
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
counter++;
if( counter == 25000 ){
LL_I2C_ClearFlag_TXE(I2Cx);
Error_Handler();
return ERROR;
}
}
LL_I2C_TransmitData8(I2Cx, value);
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);
LL_I2C_ClearFlag_STOP(I2Cx);
return SUCCESS;
}
ErrorStatus I2C_write_reg_16bit(I2C_TypeDef *I2Cx , uint8_t SlaveAddr_IC, uint8_t addr_reg, uint16_t value){
SlaveAddr_IC = SlaveAddr_IC<<1;
uint32_t counter = 0;
while(LL_I2C_IsActiveFlag_BUSY(I2Cx)==SET){
counter++;
if( counter == 25000 ){
Error_Handler();
return ERROR;
}
}
LL_I2C_HandleTransfer(I2Cx, SlaveAddr_IC,LL_I2C_ADDRSLAVE_7BIT, 3,LL_I2C_MODE_AUTOEND,LL_I2C_GENERATE_START_WRITE );
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
LL_I2C_TransmitData8(I2Cx, addr_reg);
counter=0;
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET){
counter++;
if( counter == 25000){
LL_I2C_ClearFlag_TXE(I2Cx);
Error_Handler();
return ERROR;
}
}
LL_I2C_TransmitData8(I2Cx, (uint8_t)(value>>8));
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
LL_I2C_TransmitData8(I2Cx, (uint8_t) value );
while(LL_I2C_IsActiveFlag_TXE(I2Cx)==RESET);
while(LL_I2C_IsActiveFlag_STOP(I2Cx)==RESET);
LL_I2C_ClearFlag_STOP(I2Cx);
return SUCCESS;
}