關于藍橋杯嵌入式板子的I2C,如果你以前沒有接觸過I2C通信,
重點:
- 懂得通過電路圖判斷出I2C設備的地址
- 會看I2C讀寫時序圖,
- 底層驅動,考試會給你
當然,如果你真的是0基礎,還有救!
《【STM32-I2C學習總結】STM32:硬體-IIC詳解 , 韌體庫編程 , 手把手教你實作IIC》這里是我以前寫的,硬體實作I2C的一個文章,文章末尾有軟體實作I2C的方法,硬體都會了,軟體就很簡單了
傳送門:https://blog.csdn.net/qq_45689790/article/details/113725196?spm=1001.2014.3001.5501
不得不說,官方給了你I2C的底層驅動,寫讀取函式,參考手冊,看時序圖,真的是太簡單了,
一、硬體原理圖

通過原理圖,判斷 [SCL->PB6] 、[PB7->SDA]

板載EEPROM 為2k ,E0~E2接地均為0,因此設備地址 0xA0,當然 讀寫標志位也是跟在設備地址的后面
- 讀命令:設備地址 0xA0 + 1 = 0xA1
- 寫命令:設備地址 0xA0 + 0 = 0xA0
這點在編程的時候會有所體現,想知道具體細節,翻到上面,找傳送門,
二、實作讀寫函式
1、void Byte_Write(uint8_t Write_addr,uint8_t data)

void Byte_Write(uint8_t Write_addr,uint8_t data)
{
I2CStart(); //1、發送開始信號
I2CSendByte(0xA0); //2、發送設備地址 寫命令 0xA0 + 0 = 0xA0
I2CWaitAck(); //3、等待回應
I2CSendByte(Write_addr); //4、等待回應 發送要寫入EEPROM的地址
I2CWaitAck(); //5、等待回應
I2CSendByte(data); //6、發送要寫入的地址
I2CWaitAck(); //7、等待回應
I2CStop(); //8、發送停止信號
}
2、uint8_t Byte_Read(uint8_t Read_Addr)

我好像標錯了,詳見代碼備注
uint8_t Byte_Read(uint8_t Read_Addr)
{
uint8_t data = 0;
I2CStart(); //1、發送開始信號
I2CSendByte(0xA0); //2、發送設備地址 先寫操作,0xA0 + 0 = 0xA0
I2CWaitAck(); //3、等待回應
I2CSendByte(Read_Addr); //4、寫入要讀的地址,告訴EEPROM等下需要回傳哪個值
I2CWaitAck(); //5、等待回應
I2CStart(); //6、發送開始信號,接受EEPROM回傳的資料
I2CSendByte(0xa1); //7、發送設備地址,讀操作 0xA0 + 1 =0xA1
I2CWaitAck(); //8、等待回應
data = I2CReceiveByte(); //9、讀出資料
I2CSendNotAck(); //10、發送非應答信號,準備停止
I2CStop(); //11、停止信號
return data;
}
3、Buffer_Write(uint8_t *_pWriteBuf ,uint8_t Write_Addr,uint8_t Write_Num)
void Buffer_Write(uint8_t *_pWriteBuf,uint8_t Write_Addr,uint8_t Write_Num)
{
//最多連續寫8個 注意地址對齊
uint8_t i ;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Write_Addr);
I2CWaitAck();
for(i = 0;i < Write_Num;i++)
{
I2CSendByte(_pWriteBuf[i]);
I2CWaitAck();
}
I2CStop();
}
4、void Buffer_Read(uint8_t *_pReadBuf,uint8_t Read_Addr,uint8_t Read_Num)
自己寫把,嘗試一下

有問題,可以留言
歡迎交流探討
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264557.html
標籤:其他
上一篇:[4G&5G專題-49]:物理層-為什么從事計算機領域的人,學習無線通信那么難?從物理層信號處理看無線通信思維領域的切換與跨越。
