I2C读写EEPROM文档说明_第1页
I2C读写EEPROM文档说明_第2页
I2C读写EEPROM文档说明_第3页
I2C读写EEPROM文档说明_第4页
I2C读写EEPROM文档说明_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、通过I2C通讯协议对EEPROM进行读写操作发送串口进行通讯一.描述I2CI2C协议有启动,终止,应答,非应答四种信号,有按位发送数据,按位接收数据,有读操作和写操作。1. 启动I2C程序如下,保持SCL为高电平,SDA为高电平,当检测到SDA下降沿时,启动传送,如果2个信号没有被高则返回0。程序启动成功返回1。uint8 I2C_Start(void)CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);if ( SDA_Read() = 0) return 0;if ( SCL_Read() = 0) ret

2、urn 0;SDA_Write(0);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);return 1;上面是模仿I2C启动时序 2. 终止传送程序如下SDA保持低电平 SCL保持高电平而后拉高SDA,系统检测到SDA上升沿则终止传送。void I2C_Stop(void)CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SDA_Write(1);CyDelayUs(10);3. 模拟应答信号,让SDA的低电平时间大于SCL的高电平时间,即可应答;也就是SDAvoid I2C

3、_Ack(void)CyDelayUs(10);SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);4. 模拟非应答信号,让SDA的高电平时间大于SCL高电平时间,就是非应答void I2C_Nack(void)CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);CyDelayUs(10);5. 按位发送数据,按位发送数据的要求是数据位高电平的时间大于SCL,SCL高电平时不允

4、许数据位电平变化,只有SCL低电平时才可以任意变换。uint8 I2C_Send_Byte( uint8 d)uint8 i = 8;uint8 bit_ack = 0;while( i- ) /循环发送八个位CyDelayUs(10);if ( d &0x80 ) SDA_Write(1); /按字节与 else SDA_Write(0);CyDelayUs(10);SCL_Write(1);CyDelayUs(10);SCL_Write(0);d = d << 1; CyDelayUs(10);SDA_Write(1);CyDelayUs(10);SCL_Write(1

5、);CyDelayUs(10);bit_ack = SDA_Read();SCL_Write(0);CyDelayUs(10);return bit_ack;6. 按位接收数据uint8 I2C_Receive_Byte(void)uint8 i = 8, d;CyDelayUs(10);SDA_Write(1); /SDA拉高while ( i-)d = d << 1;CyDelayUs(10);SCL_Write(1);if ( SDA_Read() ) d+;CyDelayUs(10);SCL_Write(0);return d;7. 对EEPROM进行写操作,送入写指令即可

6、进行写操作void AT24C128_W(uint8 *mcu_address, uint16 AT24C128_address, uint16 count ) /(内存中数据的首地址,eeprom地址,写入的字符数)while(count-) /count是存放的数据串长度I2C_Start(); /启动信号I2C_Send_Byte( 0xa0 );/发送一字节控制指令I2C_Send_Byte( AT24C128_address/256 );I2C_Send_Byte( AT24C128_address %256 );I2C_Send_Byte( *mcu_address );/ *mc

7、u_address存数数据的首指针I2C_Stop(); /停止信号CyDelay(10); /* waiting for write cycle to be completed */mcu_address+; /指针加1AT24C128_address+;/存储数据的EEPROM的地址加1,8. ,必须先写入读指令才能进行读取void AT24C128_R(uint8 *mcu_address,uint16 AT24C128_address,uint16 count) /(存放缓存数据的地址,eeprom地址,读取的字符长度)while(count-)I2C_Start();I2C_Send

8、_Byte( 0xa0 ); /发送写指令I2C_Send_Byte( AT24C128_address/256 ); /送入指令I2C_Send_Byte( AT24C128_address % 256 );I2C_Start(); /启动I2C_Send_Byte( 0xa1 ); /输入读指令*mcu_address = I2C_Receive_Byte(); /接收一位数据I2C_Nack(); /无应答I2C_Stop(); /停止mcu_address+; /AT24C128_address+;上面是I2C模拟时序的读写操作的几个必须部分。我们要读写的时候只需要调用void AT2

9、4C128_W(uint8 *mcu_address, uint16 AT24C128_address, uint16 count )和void AT24C128_R(uint8 *mcu_address,uint16 AT24C128_address,uint16 count)2个函数即可。具体的参数说明我们已经在上面申明了。程序如下:#include <device.h>uint8 An10 = 5,13,5,8,58,6,7,5,8,15,16,25,24,25,26,26,25,25,38,35,33,34,47,45,44,43,44,48,52,44,44,44,59,

10、59,53,55,58,67,64,65,67,62,63,63,61,72,76,71,72,74,71,80,86,83,83,84,86,83,80,86,91,98,94,90,98,95,91,90,98,100,109,101,100,106,104,106,110,117,113,109,116,110,113,113,123,118,126,122,123,124,125,128;uint8 An09 = 19,24,34,49,58,62,71,81,90,19,24,19,24,34,49,59,62,71,9,19,24,34,9,19,24,34,49,59,62,71

11、,81,90,10,19,24,49,59,19,34,49,59,62,71,81,90,9,19,24,34,71,81,9,19,24,34,49,59,62,71,81,9,19,24,34,49,59,62,71,81,9,19,24,34,49,71,81,9,19,24,34,49,62,71,81,24,34,49,59,62,71,81,9;void main() AT24C128_W(An10, 0x00, 92);CyDelay(10); AT24C128_W(An09, 0x5C, 92);/An:为数据的首地址; add:为存放在EEPROM的存放地址;92即存放数组

12、的个数CyDelay(10);UART_1_Start(); for(;) UART_1_WriteTxData(0x08); /发送串口查看程序是否运行到此 功能:把我们写入EEPROM里的数据读出来通过串口调试助手显示出来进行对比,看是否出现错误。在psoc中我们可以调用串口模块如下图:分配好管脚,分别是P17和P16,我们的硬件电路已经做好了串行口的硬件部分。我们只需要配置,刷完程序即可进行调试。下面是我们进行串口调试的程序:#include <device.h>uint8 i ;uint8 bi = 0;uint16 adda=0;uint16 addb=16284;voi

13、d main() UART_1_Start(); /启动串口 for(;) for(i=0;i<184;i+)AT24C128_R(&bi, adda, 1); /读取一个字节的数据放到&b缓存中UART_1_WriteTxData(bi); /调用串口发送程序将数发出去CyDelay(10);adda+;for(i=0;i<184;i+)AT24C128_R(&bi, addb, 1);UART_1_WriteTxData(bi);CyDelay(10);addb+;while(1); 在上面的程序中为了验证数据的对错我们二次读取了不同首地址的数据用以验证

14、。串口出来的数据如下:FF 05 0D 05 08 3A 06 07 05 08 0F 10 19 18 19 1A 1A 19 19 26 23 21 22 2F 2D 2C 2B 2C 30 34 2C 2C 2C 3B 3B 35 37 3A 43 40 41 43 3E 3F 3F 3D 48 4C 47 48 4A 47 50 56 53 53 54 56 53 50 56 5B 62 5E 5A 62 5F 5B 5A 62 64 6D 65 64 6A 68 6A 6E 75 71 6D 74 6E 71 71 7B 76 7E 7A 7B 7C 7D 80 13 18 22 3

15、1 3A 3E 47 51 5A 13 18 13 18 22 31 3B 3E 47 09 13 18 22 09 13 18 22 31 3B 3E 47 51 5A 0A 13 18 31 3B 13 22 31 3B 3E 47 51 5A 09 13 18 22 47 51 09 13 18 22 31 3B 3E 47 51 09 13 18 22 31 3B 3E 47 51 09 13 18 22 31 47 51 09 13 18 22 31 3E 47 51 18 22 31 3B 3E 47 51 09 00 0A 14 1E 28 32 3C 46 50 5A 64 6E 78 82 8C 96 A0 AA B4 BE C8 D2 DC E6 F0 FA 04 0E 18 22 2C 36 40 4A 54 5E 68 72 7C 86 90 9A A4 AE B8 C2 CC D6 E0 EA F4 FE 08 12 1C 26 30 3A 44 4E 58 62 6C 76 80 8A 94 9E A8 B2 BC C6 D0 DA E4 EE F8 02 0C 16 20 2A 34 3E 48 52 5C 66 70 7A 84 8E 98 A2 AC B6 C0 CA D4 DE 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论