【前言】
上一篇【武汉芯源CW32】OTA升级系列之五软件模拟IIC驱动-电子产品世界论坛 (eepw.com.cn)
我实现了IIC的驱动库的制作,这一篇来实现板载的EEPROM的CW24C02AD的数据读取。
【CW24C02简介】
CW24C02A/04A/08A是2048/4096/8192位的串行电可擦 除只读存储器(EEPROM),分别采用256/512/1024×8位的 组织结构,广泛应用于低电压和低功耗的工商业领域。 CW24C02A/04A/08A采用两线串行接口,支持1.7V(1.8 至5.5V)版本。
他的读写时序图如下:
【实现步骤】
1、创建CW24C02.c/h文件,并把他加入到工程分组HW中。
2、先确定他的地址,从原理图上看到三个地址线都是接到了地上,他的写地址就是0xA0,读地址为0xA1。在头文件中宏定义声明:
#define CW24C02_WADDR 0xA0 #define CW24C02_RADDR 0xA1
3、他的WC写入使能脚接到了地,所以不需要操作这个管脚,可以直接写入。
4、根据写入一个字节的时序图,我们编写写入函数如下:
uint8_t CW24C02_Write_Byte(uint8_t addr, uint8_t data) { IIC_Start(); IIC_Send_Byte(CW24C02_WADDR); if(0 != IIC_Wait_Ack(100)) return 1; IIC_Send_Byte(addr); if(0 != IIC_Wait_Ack(100)) return 2; IIC_Send_Byte(data); if(0 != IIC_Wait_Ack(100)) return 3; IIC_Stop(); return 0; }
5、写入一页,我们查看数据手册,整个页的地址为8个字节,总共有32页。所以我们在检测输入页数时,需要先检测一下是否超过页数了。代码如下:
uint8_t CW24C02_Write_Page(uint8_t addr, uint8_t *wdata) { uint8_t i; //0-31页 if(addr >=32) return 99; IIC_Start(); IIC_Send_Byte(CW24C02_WADDR); if(0 != IIC_Wait_Ack(100)) return 1; IIC_Send_Byte(addr*8); if(0 != IIC_Wait_Ack(100)) return 2; for(i=0;i<8;i++) { IIC_Send_Byte(wdata[i]); if(0 != IIC_Wait_Ack(100)) return 3+i; } IIC_Stop(); return 0; }
6、读取数据,这里我们制作了一个连继读取多个的程序:
uint8_t CW24C02_Read_Data(uint8_t addr, uint8_t *rdata, uint8_t datalen) { uint8_t i; IIC_Start(); IIC_Send_Byte(CW24C02_WADDR); if(0 != IIC_Wait_Ack(100)) return 1; IIC_Send_Byte(addr); if(0 != IIC_Wait_Ack(100)) return 2; IIC_Start(); IIC_Send_Byte(CW24C02_RADDR); if(0 != IIC_Wait_Ack(100)) return 3; for(i=0;i<datalen-1;i++) { rdata[i] = IIC_Read_Byte(1); } rdata[datalen-1] = IIC_Read_Byte(0); IIC_Stop(); return 0; }