| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- /*--------------------------------------------------
- * 用的芯片是AT24C128
- * 一共256页,每页64个字节
- * -------------------------------------------------*/
- #include "epprom.h"
- #include "I2C.h"
- #include "timeout.h"
- /*--------------------------------------------------------
- * 在AT24CXX里面的指定地址开始读出指定个数的数据
- * ReadAddr :开始读出的地址 对24c02为0~255
- *pBuffer :数据数组首地址
- *NumToRead:要读出数据的个数
- * --------------------------------------------------------*/
- void epprom_read(uint32_t ReadAddr,uint8_t *pBuffer,uint16_t NumToRead)
- {
- uint8_t addrH,addrL;
- uint16_t lentmp,lentow,lens;
- uint8_t tmp;
- if(NumToRead==0) return;
- // i2c_init();
- __set_PRIMASK(1);//关总中断
- delay_ms(100);//两次写操作,必须加间隔,否则写不进去
- //fwdgt_feed();
- lentmp=NumToRead;
- while(lentmp)
- {
- tmp=ReadAddr%PAGE_SIZE_EPPROM;
- tmp=PAGE_SIZE_EPPROM-tmp;
- if(tmp>=lentmp)//当页剩余空间大于要写入的长度
- {
- lentow=lentmp;
- }
- else
- {
- lentow=tmp;//写入长度只能是剩余空间长度
- }
- lentmp=lentmp-lentow;//计算要在下一页写入的长度
- lens=lentow;
- addrH=ReadAddr>>8;
- addrL=ReadAddr&0xff;
- i2c_start();
- i2c_send_byte(0xa0);//写
- i2c_wait_ack();
- i2c_send_byte(addrH); //发送高地址
- i2c_wait_ack();
- i2c_send_byte(addrL); //发送低地址
- i2c_wait_ack();
- delay_us(4);
- i2c_start();
- i2c_send_byte(0xa1); //读 //进入接收模式
- i2c_wait_ack();
- while(lentow)
- {
- *pBuffer=i2c_read_byte(1);
- pBuffer++;
- //ReadAddr++;
- lentow--;
- }
- i2c_read_byte(0);
- i2c_stop();//产生一个停止条件
- delay_us(4);
- //printf("at24 read %d %d\r\n", ReadAddr, lens);
- ReadAddr=ReadAddr+lens;//下一页的地址
- }
- //IIC_WRITE_PROTECT_ON(); // 写保护打开
- __set_PRIMASK(0);//开总中断
- }
- /*---------------------------------------------------------
- * 在AT24CXX里面的指定地址开始写入指定个数的数据
- * WriteAddr :开始写入的地址 对24c02为0~255
- * pBuffer :数据数组首地址
- * NumToWrite:要写入数据的个数
- * 每64bytes为一个page,
- * --------------------------------------------------------*/
- void epprom_write(uint32_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
- {
- uint8_t addrH,addrL;
- uint16_t lentmp,lentow,lens;
- uint8_t tmp;
- // rt_err_t err;
- if(NumToWrite==0) return;
- // i2c_init();
- IIC_WRITE_PROTECT_OFF(); // 写保护关闭
- __set_PRIMASK(1);//关总中断
- delay_ms(10);//两次写操作,必须加间隔,否则写不进去
- //fwdgt_feed();
- lentmp=NumToWrite;
- while(lentmp)
- {
- tmp=WriteAddr%PAGE_SIZE_EPPROM;
- tmp=PAGE_SIZE_EPPROM-tmp;
- if(tmp>=lentmp)//当页剩余空间大于要写入的长度
- {
- lentow=lentmp;
- }
- else
- {
- lentow=tmp;//写入长度只能是剩余空间长度
- }
- lentmp=lentmp-lentow;//计算要在下一页写入的长度
- lens=lentow;
- addrH=WriteAddr>>8;
- addrL=WriteAddr&0xff;
- i2c_start();
- i2c_send_byte(0xa0);
- i2c_wait_ack();
- i2c_send_byte(addrH); //发送高地址
- i2c_wait_ack();
- i2c_send_byte(addrL); //发送低地址
- i2c_wait_ack();
- while(lentow--)
- {
- i2c_send_byte(*pBuffer);
- i2c_wait_ack();
- pBuffer++;
- }
- i2c_stop();//产生一个停止条件
- delay_ms(10);
- WriteAddr=WriteAddr+lens;//下一页的地址
- }
- delay_ms(10);//两次写操作,必须加间隔,否则写不进去
- IIC_WRITE_PROTECT_ON(); // 写保护使能打开
- __set_PRIMASK(0);//开总中断
- }
- void epprom_test(void)
- {
- uint8_t i = 0,vale=0;
- for(i=1;i<128;i++){
- epprom_write(12800+i,&i,1);
- }
- for(i=1;i<128;i++){
- vale = 0;
- epprom_read(12800+i,&vale,1);
- printf("i = %d,val = %d\r\n",i,vale);
- }
- }
|