您的位置 首页 动态

STM32开发板入门教程(六) – I2C–24Cxx

我们所用来示范的24Cxx系列是最常用的EEPROM芯片。前面提到了一个地址码,24Cxx的地址码是固定的,8位如下:1010A2A1A00A2A1A0分别

咱们所用来演示的24Cxx系列是最常用的EEPROM芯片。

前面提到了一个地址码,
24Cxx的地址码是固定的,
8位如下:
1010A2 A1 A00
A2 A1 A0分别是它三个管脚的电平

24Cxx 了解起来有一个特别之处。
24Cxx 包含 01/02/04/08/16 四种,容量联系刚好和数字相同。1K 2K 4K 8K 16K
24C02 最为常见, 它的三个地址管脚A2 A1 A0都是可用的,
A2 A1 A0 有8中电平组合,也便是说,能够有8个 24C02 挂载同一个I2C总线上。
24C04呢, A0管脚就失效了,只要A2 和 A1 有用,四种组合,最多有4个24C04在总线上,
以此类推。24C16只能有一个在总线上。
这儿就欠好了解了,为什么要这样呢。
事实是一片 24C16 == 8片24C02 总线挂到一同。A2 A1 A0尽管起不到设置作用了,但你运用地址码仍是会访问到特定的区域。
理解了吧。所以其实24C系列的代码是通用的。
地址码也是固定的。便是 0xA0 0xA2 0xA4 0xA6 0xA8 0xAA 0xAC 0xAE
好,咱们以24C16为典范吧。

IO设置在I2C1上,无Remap,复用开漏输出。I2C 总线是挂4.7k电阻上拉到高电平的。
//———————–I2C——————————————–
/* Configure I2C1 pins: SCL and SDA */
GPIO_InitStruct.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; //复用开漏输出
GPIO_Init(GPIOB, &GPIO_InitStruct);

I2C init函数:

void i2c_24c_init(I2C_TypeDef *I2Cx)
{
I2C_InitTypeDef I2C_InitStruct;

I2C_InitStruct.I2C_Mode = I2C_Mode_I2C; // I2C形式
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable; // ACK 在通讯中常见,握手包,即发送到了一个数据,接纳方回一句,我收到鸟。
I2C_InitStruct.I2C_ClockSpeed = I2C_Speed;// I2C 速度设置,一般是40KHZ,400KHZ是极限,一般到不了那么高
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;//快速形式下的选项,这儿先不讲,100KHZ以上才有用
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//应对地址码长度,7位或许10位,24C是7位

// EEprom Block Select;
I2C_InitStruct.I2C_OwnAddress1 = I2C_Slave_Adress7; //第一个设备本身地址

I2C_Cmd(I2Cx,ENABLE); //敞开I2C

I2C_Init(I2Cx,&I2C_InitStruct);//将刚刚的设置送进去
}

留意:现在的片子一般都不止一个I2C。所以用了上述形式,请详细看注释。

写一个字节进EEPROM:
参数解说:Byte待写的字节,WriteAddr估计写入的地址,ByteToWrite写多少给字节,EE24cBlockSelect挑选EEPROM相应的区域(I2C地址),*I2Cx,I2C设备指针
void i2c_24c_byte_write(unsigned char Byte, unsigned char WriteAddr, unsigned int ByteToWrite, unsigned char EE24cBlockSelect,I2C_TypeDef *I2Cx)
{
// Start the I2C
I2C_GenerateSTART(I2Cx,ENABLE); //翻开I2C,开端发送进程

//not recommanded, stupid way
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));//设置主机形式

I2C_Send7bitAddress(I2Cx,EE24cBlockSelect,I2C_Direction_Transmitter); //发送片选,挑选哪一片区域写。i2C地址区别

// when get ACK, means Set Success
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等候这次挑选进程完结

I2C_SendData(I2Cx, WriteAddr);//发送要写入的地址码

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等候字节发送完结

I2C_SendData(I2Cx, Byte); //发送要写的字节

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等候直到字节发送完结

I2C_GenerateSTOP(I2Cx, ENABLE); //发送进程完毕。
}

读EEPROM函数相似,却略微杂乱。
参数阐明:pBuffer接纳I2C数据的缓冲区,Addr读的地址,NumToRead读多少个字节,ee24cblockselect读哪个区域,I2Cx i2c设备指针
void i2c_24c_buffer_read(unsigned char *pBuffer, unsigned char Addr,unsigned char NumToRead,unsigned char EE24cBlockSelect, I2C_TypeDef *I2Cx)
{
//open I2C
I2C_GenerateSTART(I2Cx, ENABLE);//开端发送

while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))); //设置自己为主机

I2C_Send7bitAddress(I2Cx,EE24cBlockSelect,I2C_Direction_Transmitter);//设置自己为发送

while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))); //等候主机发送形式设置成功

I2C_Cmd(I2Cx,ENABLE);//使能I2C

I2C_SendData(I2Cx, Addr); //发送地址码,即要读的地址

while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)));//等候主机发送进程完结

I2C_GenerateSTART(I2Cx, ENABLE); //I2C开端发送

while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)));//设置主机形式

I2C_Send7bitAddress(I2Cx,EE24cBlockSelect,I2C_Direction_Receiver); //设置从机地址,并设置主机为接纳形式

while(!(I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))); //承认该进程完结

while(NumToRead)
{
if(NumToRead==1)
{
I2C_AcknowledgeConfig(I2Cx, DISABLE);//封闭I2C的应对功用

I2C_GenerateSTOP(I2Cx, ENABLE); //发送完毕信息
}

if((I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)))//假如接纳到信息了
{
*pBuffer = I2C_ReceiveData(I2Cx);//把接纳到的数据 填进缓冲区傍边

pBuffer++;

NumToRead–;
}
}

I2C_AcknowledgeConfig(I2Cx, ENABLE);//敞开主机I2C的应对功用

}

在写i2C和读i2C之间要刺进下面函数等候,不然会有问题

I2C_EE_WaitEepromStandbyState();

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/276749.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部