[Lanqiaoカップ組み込み拡張ボード] —I2C読み取りおよび書き込みEEPROMの詳細

青いブリッジカップ組み込みボードのI2Cについて、これまでI2C通信に触れたことがない場合。
フォーカス:

  1. 回路図からI2Cデバイスのアドレスを決定する方法を知っている
  2. I2Cの読み取りと書き込みのタイミング図を見ていきます。
  3. 低レベルのドライバー、試験はあなたに与えます

もちろん、あなたが本当にゼロベースであるならば、まだ救助があります!

「[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です。書き込みフラグビットもデバイスアドレスの後に続きます

  1. 読み取りコマンド:デバイスアドレス0xA0 + 1 = 0xA1
  2. 書き込みコマンド:デバイスアドレス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;
}

3Buffer_Writeuint8_t * _pWriteBufuint8_t Write_Addruint8_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)

自己写把,尝试一下

ここに画像の説明を挿入
ご不明な点がございましたら、メッセージを残してください

交換と議論へようこそ

おすすめ

転載: blog.csdn.net/qq_45689790/article/details/114177991