⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2cmem.c

📁 MSP430的I2C模块
💻 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 + -