📄 i2cmem.c
字号:
#include "chip.h"
#include "hdi2c.h"
#include "i2cmem.h"
#include "sport1.h"
#include "hd.h"
//#define MEMLEN 32768 //for 256Kb(32KB)
//#define MEMLEN 16384 //for 128Kb(16KB)
#define MEMLEN 8192 //for 64Kb(8KB)
//#define MEMLEN 4096 //for 32Kb(4KB)
//#define MEMLEN 2048 //for 16Kb(2KB)
//#define MEMLEN 1024 //for 8Kb(1KB)
//#define MEMLEN 512 //for 4Kb(512KB)
//#define MEMLEN 256 //for 2Kb(256KB)
unsigned int addcnt; //chkcnt;
unsigned char memoutbuf[66],meminbuf[66];
unsigned char memchkflg;
extern unsigned char *ptrI2CBuf,I2CRxMode;
void MemWrDelay(unsigned int i)
{
while(i--);
}
unsigned char CheckMem(unsigned char *ps,unsigned char *pt,unsigned char len)
{
char cnt;
for(cnt=0;cnt<len;cnt++)
{
if(*(ps+cnt)!=*(pt+cnt))
{
return 0x0;
}
}
return 0xff;
}
void I2CWrMemNBytes(unsigned char DeviceID, unsigned int memcnt, unsigned char *ptrbuf) //写存储器N字节,EEPOM首地址为缓冲区的开头两个字节
{
I2CTxNBytes(DeviceID,ptrbuf,memcnt+2); //数据长度+EERPOM首地址长度
}
void I2CRdMemNBytes(unsigned char DeviceID,unsigned int memcnt, unsigned char *ptrbuf)
{
I2CTxNBytes(DeviceID,ptrbuf,2); //the first address of EEprom memory
ptrI2CBuf=ptrbuf+2; //data buffer pionter
UCTL0 |=MST ; //7-bit addressing; I2C master mode; Disabling DMA and Loopback enabled.
while(CHK_I2CBUS_STAT); //Optional,Checking I2C Bus status for mulit-master mode
while(CHK_I2C_BUSY); //Waiting for previous completion of Tx/Rx
I2CRxMode=1; //Setting Multip-Byte Rx mode
I2CNDAT=memcnt; //Setting the first address length of memory to be read
I2CTCTL &=~I2CTRX; //Rx mode
I2CTCTL |=I2CSTP | I2CSTT; //Setting STOP condition when I2CNDAT reached.
while(!CHK_I2C_RXRDY); //waiting for Rx data
while(CHK_I2C_BUSY);
}
unsigned char I2CMemPatternTest(unsigned char pattern)
{
unsigned int memcnt;
for(memcnt=0;memcnt<MEMLEN;memcnt+=MEMPAGE_SIZE)
{
memoutbuf[0]=(memcnt & 0xff00)>>8; //设置写入的EEPROM首地址
memoutbuf[1]=memcnt & 0x00ff;
meminbuf[0]=(memcnt & 0xff00)>>8; //设置读出的EEPROM首地址
meminbuf[1]=memcnt & 0x00ff;
Tx1S("Checking 0x");
Tx1HexC(memoutbuf[0]); //显示被测试存储器首地址
Tx1HexC(memoutbuf[1]);
memset(&memoutbuf[2],pattern,MEMPAGE_SIZE); //初始化写入数据缓冲区
memset(&meminbuf[2],0,MEMPAGE_SIZE); //初始化读出数据缓冲区
I2CWrMemNBytes(MEMI2C_ADDR,MEMPAGE_SIZE,memoutbuf); //写存储器N字节,EEPOM首地址为缓冲区的开头两个字节
MemWrDelay(10000); //等待存储器写入完成
I2CRdMemNBytes(MEMI2C_ADDR,MEMPAGE_SIZE,meminbuf); //读出刚才写入存储器的数据
if(CheckMem(&memoutbuf[2],&meminbuf[2],MEMPAGE_SIZE)) Tx1S("......Successful\n"); //比较存储器数据
else
{
Tx1S("......Failed\n"); //存储器数据比较失败(存储器内数据有错误)
return 0x00;
}
}
return 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -