青いブリッジカップ組み込みボードのI2Cについて、これまでI2C通信に触れたことがない場合。
フォーカス:
- 回路図からI2Cデバイスのアドレスを決定する方法を知っている
- I2Cの読み取りと書き込みのタイミング図を見ていきます。
- 低レベルのドライバー、試験はあなたに与えます
もちろん、あなたが本当にゼロベースであるならば、まだ救助があります!
「[STM32-I2C学習の概要] STM32:詳細なハードウェア-IIC、ファームウェアライブラリプログラミング、IICの実装方法を教えてください」これは私が以前に書いた記事、I2Cのハードウェア実装、記事の最後にソフトウェア実装がありますI2Cの方法、ハードウェア、ソフトウェアは非常に簡単です、となります
ポータル:https://blog.csdn.net/qq_45689790/article/details/113725196?spm = 1001.2014.3001.5501
関係者からI2C低レベルドライバー、書き込みおよび読み取り機能、マニュアルの参照、タイミング図の確認が提供されたと言わざるを得ませんが、これは非常に単純すぎます。
1.ハードウェアの概略図
回路図から、EEPROMの[SCL-> PB6]と[PB7-> SDA]
は2kであり、E0〜E2はすべて0に接地されていると判断されるため、デバイスアドレスは0xA0です。書き込みフラグビットもデバイスアドレスの後に続きます
- 読み取りコマンド:デバイスアドレス0xA0 + 1 = 0xA1
- 書き込みコマンド:デバイスアドレス0xA0 + 0 = 0xA0
これはプログラミングに反映されます。具体的な詳細を知りたい場合は、上部に移動してポータルを探してください。
次に、読み取りおよび書き込み関数1を実現し
ます。voidByte_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)
自己写把,尝试一下
ご不明な点がございましたら、メッセージを残してください
交換と議論へようこそ