完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
这段时间项目上正好用到IIC协议,而MM32板子上正好就有利用IIC协议通信的EEPROM24C02,这个帖子就来个一锅烩,将IIC和24C02联系到一起做一个完整的实验。 首先,介绍一下IIC协议:IIC总线是有飞利浦公司推出的串行总线标准。总线上扩展的外围器件及外设接口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能总线。在硬件方面,IIC总线通过串行数据线SDA和串行时钟先SCL(主从设备功用一个时钟,同步通信方式),可发送和接收数据。总线上所有的器件要依靠SDA发送的地址信号进行寻址,不需要片选(cs)线。 IIC总线组成的系统结构简单,占用空间小,需要管脚数量少,无需片选信号,且成本较低,传输最高速率可达400kbps,支持多主器件,但是同一时刻只允许有一个主控器件。在硬件方面有一个对通讯是否成功比较关键的问题就是,IIC总线上所有的设备的SDA,SCL引脚必须外接上拉电阻,一般为10K。而且,IIC总线上所有外围器件都需要有唯一的7位地址,这个地址中器件地址在器件出厂时就已经给定,且不能更改。 IIC总线在传送数据的过程中共有三种类型的信号:开始信号,停止信号,应答信号。 开始信号:SCL保持高电平状态下,SDA出现下降沿,即为开始信号,一旦有开始信号产生,则总线就会被认为“忙”;停止信号:SCL保持高电平的状态下,SDA出现上升沿,即为停止信号,一旦有停止信号产生,则纵向就被认为“空闲”;应答信号:接受数据的器件在接受到8为数据后,向发送数据的器件发送特定的低电平脉冲,表示已经接受到数据。而且,在数据传输开始后,SCL为高电平的时候,SDA的数据必须保持稳定,只有当SCL为低电平的时候才允许SDA上的数据变化。 其次,24C02简介:AT24c02 是带有I2C总线接口的E2PROM存储器,具有掉电记忆的功能,并且可以象普通RAM一样用程序改写。它的容量是1024 个字节,有A2、A1、A0 三位地址,可见I2C 总线上可以连接8 片AT24c02,它的寻址字节是1010 A2A1A0 R/W。 然后,看一下板子上AT24C02与MCU之间的硬件连接,一边配置相应的管脚。 ![]() SDA对应MCU的PB9,SCL对应MCU的PB8。 由上图中的硬件连接可知:从上面的电路连接知:E2E1E0=000,可见如果要对24c02进行写操作, 寻址字节是1010 0000;如果对24c02 进行读操作,寻址字节是1010 000 1。 写过程: (1)主机首先发出开始信号 (2)发出写24c02的寻址字节1010 000 0。 (3)发数据写入24c02 的地址。 (4)往24c02 中写入数据。 (5)写完毕发出停止信号。 读过程: (1)主机发出start 信号。 (2)发写24c02 的寻址字节1010 000 0(我们是读数据,为什么要发写信号呢?这是因为你 首先要送出一个信号,说明从24c02 中的哪个地址读取数据。)。 (3)发要读取的数据在24c02 中的地址。 (4)主机发start信号。 (5)发读24c02 的寻址字节1010 000 1。 (5)从24 C02 中读取数据。 (6)读取完毕发出停止信号。 读写的大致程序如上所述,下面主要就是代码的编写: mm32f031自带硬件IIC,所以不用模拟,如果大家有兴趣也可以自己模拟一下试试。(之前用STM32的时候,比较两种方式,模拟的 更好用一点)。 之前有说过工程框架的搭建,这次就贴一下核心的代码,具体的流程就不在此赘余。 IIC硬件初始化: void IICInitMaster(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //I2C1重映射IO口 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //保持总线空闲即CLK&DATA为高 GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_InitStructure.I2C_Mode = I2C_Mode_MASTER;//主模式 I2C_InitStructure.I2C_OwnAddress = FLASH_DEVICE_ADDR; I2C_InitStructure.I2C_Speed = I2C_Speed_STANDARD; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); I2C_Cmd(I2C1, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_1); GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_1); } 从设备地址选择: void IICSetDeviceAddr(unsigned char deviceaddr) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //I2C1重映射IO口 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); I2C_Cmd(I2C1,DISABLE); I2C_Send7bitAddress(I2C1, deviceaddr , I2C_Direction_Transmitter); I2C_Cmd(I2C1, ENABLE); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOB, &GPIO_InitStructure); } 发送数据: void IICMasterWrite(unsigned short mem_byte_addr, unsigned short tx_count, unsigned char *tx_data ) { unsigned short temp; unsigned short i; unsigned char *p; uint32_t j; p = tx_data; temp = ((mem_byte_addr) & 0xff); I2CTXByte(CMD_WRITE,temp); //tx memory addr for(i=0;i temp = *p; p++; I2CTXByte(CMD_WRITE,temp); //tx data } while(1) { if(I2C_GetFlagStatus(I2C1, I2C_FLAG_STOP_DET)) { temp = I2C1->IC_CLR_STOP_DET; break; } } for(j=0;j<50000;j++); } 接受数据: void IICMasterRead( unsigned short mem_byte_addr, unsigned short rx_count, unsigned char *rx_data ) { unsigned char temp=0; unsigned short i; temp = ((mem_byte_addr) & 0xff); I2CTXByte(CMD_WRITE,temp); //tx memory addr for(i=0;i temp = I2CRXByte(); printf("RX data is : %x rn",temp); } } 这个工程有一个不完美的点是:无法通过现象观察到是否成功,等下一帖把串口通信写了,加进去通过串口助手将接收数据进行显示,实验结果就能进行验证了。另外,还可以通过接受发送中断,来控制LED闪烁,也可以通过得到验证。 |
|
相关推荐
4 个讨论
|
|
主要是还行写一个专门讲串口的帖子
|
|
|
|
|
|
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
2260个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
12117 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
6077 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
11175 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4654 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4395 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
1936浏览 1评论
915浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-24 08:52 , Processed in 0.779159 second(s), Total 53, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191