关于蓝桥杯嵌入式板子的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,当然 读写标志位也是跟在设备地址的后面
这点在编程的时候会有所体现,想知道具体细节,翻到上面,找传送门。
二、实现读写函数
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)
自己写把,尝试一下
欢迎交流探讨
/更新*/void Buffer_Read(uint8_t *_pReadBuf,uint8_t Read_Addr,uint8_t Read_Num)
{
uint8_t data = 0;
uint8_t i ;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Read_Addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
for(i = 0; i < Read_Num; i++)
{
_pReadBuf[i] = I2CReceiveByte();
if(i!=Read_Num-1)
{
I2CSendAck();
}
else
{
I2CSendNotAck();
}
}
I2CStop();
}
/———————————————— 更新——————————————————/
有读者私信,连续读取写不出来,参考如下:
void Buffer_Read(uint8_t *_pReadBuf,uint8_t Read_Addr,uint8_t Read_Num)
{
uint8_t data = 0;
uint8_t i ;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(Read_Addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
for(i = 0; i < Read_Num; i++)
{
_pReadBuf[i] = I2CReceiveByte();
if(i!=Read_Num-1)
{
I2CSendAck();
}
else
{
I2CSendNotAck();
}
}
I2CStop();
}