STM32中I2C总线上数据的读、写。
生活随笔
收集整理的這篇文章主要介紹了
STM32中I2C总线上数据的读、写。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*** @brief 從I2C1總線上的某一器件的某一起始地址中讀取一定字節的數據到數組中* @param driver_Addr:I2C器件地址* @param start_Addr:起始字節地址* @param number_Bytes:要讀取的字節數量(小于一頁)* @param read_Buffer:存放讀取數據的數組指針* @retval 是否讀取成功*/
u8 I2C1_Read_NBytes(u8 driver_Addr, u8 start_Addr, u8 number_Bytes, u8 *read_Buffer)
{uint8_t read_Num;u8 I2C_Timeout;I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET){if((I2C_Timeout--) == 0){return 1;}}I2C_TransferHandling(I2C1, driver_Addr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write); //I2C_No_StartStop I2C_Generate_Start_WriteI2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){if((I2C_Timeout--) == 0){return 1;}}I2C_SendData(I2C1, start_Addr);I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TC) == RESET){if((I2C_Timeout--) == 0){return 1;}} I2C_TransferHandling(I2C1, driver_Addr, number_Bytes, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);for(read_Num = 0; read_Num<number_Bytes; read_Num++){I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET){if((I2C_Timeout--) == 0){return 1;}} read_Buffer[read_Num] = I2C_ReceiveData(I2C1);} I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET);{if((I2C_Timeout--) == 0){return 1;}}return 0;
}
u8 I2C1_Write_NBytes(u8 driver_Addr, u8 start_Addr, u8 number_Bytes, u8 *write_Buffer) {u8 write_Num;u8 I2C_Timeout;I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET){if((I2C_Timeout--) == 0){//I2C_ClearFlag(I2C1, I2C_FLAG_BUSY);return 1;}}I2C_TransferHandling(I2C1, driver_Addr, number_Bytes+1, I2C_AutoEnd_Mode, I2C_Generate_Start_Write);I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){if((I2C_Timeout--) == 0){return 1;}}I2C_SendData(I2C1, start_Addr);//while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//I2C_TransferHandling(I2C1, driver_Addr, number_Bytes, I2C_AutoEnd_Mode, I2C_No_StartStop); for(write_Num = 0; write_Num<number_Bytes; write_Num++){I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){ if((I2C_Timeout--) == 0){return 1;}}I2C_SendData(I2C1, write_Buffer[write_Num]); }I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET){if((I2C_Timeout--) == 0){return 1;}}return 0; }
u8 I2C1_Write_NBytes(u8 driver_Addr, u8 start_Addr, u8 number_Bytes, u8 *write_Buffer) {u8 write_Num;u8 I2C_Timeout;I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET){if((I2C_Timeout--) == 0){//I2C_ClearFlag(I2C1, I2C_FLAG_BUSY);return 1;}}I2C_TransferHandling(I2C1, driver_Addr, number_Bytes+1, I2C_AutoEnd_Mode, I2C_Generate_Start_Write);I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){if((I2C_Timeout--) == 0){return 1;}}I2C_SendData(I2C1, start_Addr);//while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET);//I2C_TransferHandling(I2C1, driver_Addr, number_Bytes, I2C_AutoEnd_Mode, I2C_No_StartStop); for(write_Num = 0; write_Num<number_Bytes; write_Num++){I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXIS) == RESET){ if((I2C_Timeout--) == 0){return 1;}}I2C_SendData(I2C1, write_Buffer[write_Num]); }I2C_Timeout = 200;while(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF) == RESET){if((I2C_Timeout--) == 0){return 1;}}return 0; }
總結
以上是生活随笔為你收集整理的STM32中I2C总线上数据的读、写。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32F030控制蜂鸣器定时响和控制
- 下一篇: C语言实现PID算法:位置式PID和增量