123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- #include "delay.h"
- #include "24CXX.h"
- //////////////////////////////////////////////////////////////////////////////////
- // 2203/4/X GHz_ljw 合并版
- //////////////////////////////////////////////////////////////////////////////
- //在AT24CXX指定地址读出一个数据
- //ReadAddr:开始读数的地址
- //返回值 :读到的数据
- //ljw 23.6.30 Tested
- u8 AT24CXX_ReadOneByte(u16 ReadAddr)
- {
- u8 ack=0;
- u8 data=0;
- IIC_Start();
- if(EE_TYPE>AT24C16)
- {
- IIC_Send_Byte(0XA0); //发送写命令
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- goto fail;
- }
- IIC_Send_Byte(ReadAddr>>8);//发送高地址
- } else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件固定地址0XA0,写数据
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- goto fail;
- }
- IIC_Send_Byte(ReadAddr%256); //发送低地址
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- goto fail;
- }
- IIC_Start();
- IIC_Send_Byte(0XA1); //进入接收模式
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- goto fail;
- }
- data=IIC_Read_Byte(0);
- IIC_Stop();//产生一个停止条件
-
- return data;
-
- fail:
- IIC_Stop();//产生一个停止条件
-
- return 0;
- }
- /*
- u8 AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
- {
- //u8 test = 0;
- IIC_Start();
- if(EE_TYPE>AT24C16)
- {
- IIC_Send_Byte(0XA0); //发送写命令
- IIC_Wait_Ack();
- IIC_Send_Byte(WriteAddr>>8);//发送高地址
- }
- else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
-
- IIC_Wait_Ack();
- IIC_Send_Byte(WriteAddr%256); //发送低地址
- IIC_Wait_Ack();
- IIC_Send_Byte(DataToWrite); //发送字节
- IIC_Wait_Ack();
- //test = test; // 测试用,消除waring
- IIC_Stop();//产生一个停止条件
- delay_ms(10);
- return 1;
- }*/
- //在AT24CXX指定地址写入一个数据
- //WriteAddr :写入数据的目的地址
- //DataToWrite:要写入的数据
- //ljw 23.6.30 Tested
- u8 AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
- {
- u8 ack = 0;
- IIC_Start();
- if(EE_TYPE>AT24C16)
- //if(0)
- {
- IIC_Send_Byte(0XA0); //发送写命令
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- //goto fail;
- }
- IIC_Send_Byte(WriteAddr>>8);//发送高地址
- }
- else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //发送器件地址0XA0,写数据
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- //goto fail;
- }
- IIC_Send_Byte(WriteAddr%256); //发送低地址
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- //goto fail;
- }
- IIC_Send_Byte(DataToWrite); //发送字节
- ack = IIC_Wait_Ack();
- if(ack!=0)
- {
- //goto fail;
- }
-
- IIC_Stop();//产生一个停止条件
- delay_ms(15);
- return 1;
- /*fail:
- IIC_Stop();//产生一个停止条件
-
- return 0;*/
- }
- //在AT24CXX里面的指定地址开始写入长度为Len的数据
- //该函数用于写入16bit或者32bit的数据.
- //WriteAddr :开始写入的地址
- //DataToWrite:数据数组首地址
- //Len :要写入数据的长度2,4
- void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
- {
- u8 t;
- for(t=0; t<Len; t++)
- {
- AT24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
- }
- }
- //在AT24CXX里面的指定地址开始读出长度为Len的数据
- //该函数用于读出16bit或者32bit的数据.
- //ReadAddr :开始读出的地址
- //返回值 :数据
- //Len :要读出数据的长度2,4
- u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
- {
- u8 t;
- u32 temp=0;
- for(t=0; t<Len; t++)
- {
- temp<<=8;
- temp+=AT24CXX_ReadOneByte(ReadAddr+Len-t-1);
- }
- return temp;
- }
- //检查AT24CXX是否正常
- //这里用了24XX的最后一个地址(255)来存储标志字.
- //23.3.x ,AT24C32 => 0x0FFF, GHz ljw
- //如果用其他24C系列,这个地址要修改
- //返回1:检测失败
- //返回0:检测成功
- u8 AT24CXX_Check(void)
- {
- u8 temp;
- temp=AT24CXX_ReadOneByte(0xFF);//避免每次开机都写AT24CXX
- if(temp==0X28)
- {
- return 0;
- }
- else//排除第一次初始化的情况
- {
- AT24CXX_WriteOneByte(0xFF,0X28);
- temp=AT24CXX_ReadOneByte(0xFF);
- if(temp==0X28)
- {
- return 0;
- }
- }
- return 1;
- }
- //在AT24CXX里面的指定地址开始读出指定个数的数据
- //ReadAddr :开始读出的地址 对24c02为0~255
- //pBuffer :数据数组首地址
- //NumToRead:要读出数据的个数
- void AT24CXX_Read(u16 ReadAddr,u8 *pBuffer,u16 NumToRead)
- {
- while(NumToRead)
- {
- *pBuffer++=AT24CXX_ReadOneByte(ReadAddr++);
- NumToRead--;
- }
- }
- //在AT24CXX里面的指定地址开始写入指定个数的数据
- //WriteAddr :开始写入的地址 对24c02为0~255
- //pBuffer :数据数组首地址
- //NumToWrite:要写入数据的个数
- u8 AT24CXX_Write(u16 WriteAddr,u8 *pBuffer,u16 NumToWrite)
- {
- u8 result =0;
- while(NumToWrite--)
- {
- result = AT24CXX_WriteOneByte(WriteAddr,*pBuffer);
- if(result!=1)
- {
- return 0;
- }
- WriteAddr++;
- pBuffer++;
- }
- return 1;
- }
|