24c01存储器读写代码.docx
《24c01存储器读写代码.docx》由会员分享,可在线阅读,更多相关《24c01存储器读写代码.docx(17页珍藏版)》请在冰点文库上搜索。
24c01存储器读写代码
**入口参数:
无
**出口参数:
无
**************************************************************************/
voidiic_init(void)
{
PINSEL0|=(PINSEL0&(~0xF0))|0xa<<20;
I22SCLH=(11059200/400000+1)/2;/*设定I2C2时钟*/
I22SCLL=(11059200/400000)/2;
I22CONCLR=0x6c;
I22CONSET=0x40;
/*I2C2中断开启控制*/
VICIntSelect=0x00000000;/*设置所有通道为IRQ中断*/
VICVectPriority30=5;/*I2C2通道分配到IRQslot0,最高优先级*/
VICVectAddr30=(uint)IRQ_I2C2;/*设置I2C2中断向量*/
VICIntEnable=(1<<30);/*使能I2C2中断*/
}
/**************************************************************************
**函数名次:
延时程序。
**入口参数:
延时时间。
**出口参数:
无
**************************************************************************/
voidDelayNS(int32dly)
{
inti;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/**************************************************************************
**函数名次:
通用异步收发器(UART)0发送程序。
**入口参数:
无
**出口参数:
无
**************************************************************************/
int32sendchar(int32ch)
{/*WritecharactertoSerialPort*/
while(!
(U0LSR&0x20));
return(U0THR=ch);
}
/**************************************************************************
**函数名次:
IIC读程序,向AT24C02读出字节长度为len个字节。
**入口参数:
addr:
AT24C02器件物理地址,*dat:
将要写入数据缓冲区,len:
数据的长度。
**出口参数:
成功返回0
**************************************************************************/
ucharI2C2_ReadData(int32addr,uchar*dat,ucharlen)
{
if(len>0){
I2C_ADDR=AT24C16_addr+((addr>>7)&0x0e)+1;/*读器件的从地址,R=1*/
I2C_SUB_ADDR=addr&0xff;
I2C_BUF=dat;
I2C_NUM=len;
I2C_WR_EN=Read;
I2C_END=0;
/*清除STA,SI,AA标志位*/
I22CONCLR=(1<<2)|/*AA*/
(1<<3)|/*SI*/
(1<<5);/*STA*/
/*置位STA,启动I2C总线*/
I22CONSET=(1<<5)|/*STA*/
(1<<6);/*I2CEN*/
/*等待读操作完成*/
while(!
I2C_END);
}
return0;
}
/**************************************************************************
**函数名次:
IIC写程序,向AT24C02写入字节长度为len个字节
**入口参数:
addr:
AT24C02器件物理地址,*dat:
将要写入数据缓冲区,len:
数据的长度。
**出口参数:
成功返回0
**************************************************************************/
ucharI2C2_WriteData(int32addr,uchar*dat,ucharlen)
{
if(len>0){
I2C_ADDR=AT24C16_addr+((addr>>7)&0x0e);/*读器件的从地址,R=1地址长度8+X*/
I2C_SUB_ADDR=addr&0xff;
I2C_BUF=dat;
I2C_NUM=len;
I2C_WR_EN=Write;
I2C_END=0;
/*清除STA,SI,AA标志位*/
I22CONCLR=(1<<2)|/*AA*/
(1<<3)|/*SI*/
(1<<5);/*STA*/
/*置位STA,启动I2C总线*/
I22CONSET=(1<<5)|/*STA*/
(1<<6);/*I2CEN*/
/*等待写操作完成*/
while(!
I2C_END);
}
return0;
}
/**************************************************************************
**函数名次:
硬件I2C中断服务程序。
**入口参数:
无
**出口参数:
无
**************************************************************************/
/*Write2bytes:
0818282828
Read2bytes:
0818281040505058
sendchar()用于读取状态*/
void__irqIRQ_I2C2(void)
{
switch(I22STAT&0xf8)
{
case0x08:
/*已发送起始条件。
将发送从机地址+R/W位和接收ACK位。
*/
if(I2C_WR_EN==Read)/*指定子地址读*/
I22DAT=I2C_ADDR&0xfe;/*向I2DAT写入从机地址和R/W位*/
else/*指定子地址写*/
I22DAT=I2C_ADDR;/*向I2DAT写入从机地址和R/W位*/
I22CONSET=0x04;/*置位AA位*/
I22CONCLR=(1<<3)|(1<<5);/*清零SI,STA*/
break;
case0x10:
/*已发送重复起始条件。
将发送从机地址+R/W位和接收ACK位。
*/
I22DAT=I2C_ADDR;/*向I2DAT写入从机地址和R/W位*/
I22CONCLR=(1<<3)|(1<<5);/*清零SI,STA*/
break;
case0x18:
/*将发送数据字节,接收ACK位*/
if(I2C_WR_EN==Read)/*读指定地址,对地址进行处理*/
{
I22DAT=(I2C_SUB_ADDR&0xff);
I22CONCLR=0x28;/*清零SI,STA*/
//I22CONSET=0x20;/*重新启动*/
//I2C_WR_EN=Nothing_ToDo;
}
if(I2C_WR_EN==Write)/*写指定地址,对地址进行处理*/
{
I22DAT=(I2C_SUB_ADDR&0xff);/*将子地址装入I2DAT*/
I22CONSET=0x04;/*置位AA位*/
I22CONCLR=0x08;/*清除SI标志。
*/
}
break;
case0x28:
//将发送数据字节,接收ACK位//
if(I2C_WR_EN==Write)
{
if(I2C_NUM>0)/*有数据要写*/
{
I22DAT=*I2C_BUF++;/*向I2DAT装入主机发送缓冲区的下一个数据字节。
主机发送缓冲区指针加1。
*/
I22CONSET=0x04;/*置位AA位*/
I22CONCLR=0x08;/*清零SI*/
I2C_NUM--;/*主机数据计数器减1*/
}
else//已经没数据要写
{
I22DAT=*I2C_BUF;/*向I2DAT装入主机发送缓冲区的下一个数据字节*/
I22CONSET=0x14;/*置位AA位*/
I22CONCLR=0x08;/*清零SI*/
I2C_END=1;/*写数据结束置1*/
}
}
if(I2C_WR_EN==Read)
{
I22CONCLR=0x28;/*清零SI,STA*/
I22CONSET=0x20;/*重新启动*/
}
break;
case0x40:
/*前面的状态是状态08或状态10,已发送从机地址+读,已接收到ACK。
将接收数据和返回ACK。
*/
if(I2C_NUM>=1)
I22CONSET|=1<<2;/*置位AA位*/
else
I22CONCLR|=1<<2;/*清除AA*/
I22CONCLR=(1<<3)|(1<<5);/*清零SI,STA*/
break;
case0x20:
/*已发送SLA+W,已接收非应答*/
case0x30:
/*已发送I2DAT中的数据,已接收非应答*/
case0x38:
/*在SLA+R/W或数据字节中丢失仲裁*/
case0x48:
/*已发送SLA+R,已接收非应答,将发送停止条件*/
I22CONCLR=0x28;/*清零SI,STA*/
break;
case0x50:
/*已接收数据,已返回ACK。
将从I2DAT读取数据。
将接收其它的数据。
如果这是最后一个数据字节,则将返回非应答,否则将返回ACK。
*/
*I2C_BUF++=I22DAT;/*读取I2DAT中的数据字节,存放到主机接收缓冲区,主机接收缓冲区指针加1*/
I2C_NUM--;/*主机数据计数器减1*/
if(I2C_NUM==0)/*如果是最后一个字节,写0x0C到I2CONCLR来清除SI标志和AA位*/
{
I22CONCLR=(1<<3)|(1<<2);/*清除SI,AA*/
}
else/*如果不是最后一个字节*/
{
I22CONSET=0x04;/*置位答标志位AA*/
I22CONCLR=0x08;/*清除SI标志*/
}
break;
case0x58:
/*已接收到数据,已返回非应答。
将从I2DAT中读取数据和发送停止条件。
*/
*I2C_BUF=I22DAT;/*读取I2DAT中的数据字节,存放到主机接收缓冲区。
*/
I22CONSET=0x14;/*停止标志位STO=1,AA=1*/
I22CONCLR=(1<<3);/*清除SI,STA*/
I2C_END=1;/*读数据结束置1*/
break;
}
VICVectAddr=0x00;
}
#include"EEPROM.h"
ucharI2C_ADDR;//AT24C02物理地址
ucharI2C_SUB_ADDR;//子地址
ucharADDR_NUM=1;//AT24C02物理地址长度为1(8+3)*/
uchar*I2C_BUF;//数据缓冲区
ucharI2C_NUM;//数据个数
ucharI2C_END;//数据结束标志
ucharI2C_WR_EN;//数据读写标记1为读,0为写2为处理子地址
/**************************************************************************
**函数名次:
IIC初始化程序。
**入口参数:
无
**出口参数:
无
**************************************************************************/
voidiic_init(void)
{
PINSEL0|=(PINSEL0&(~0xF0))|0xa<<20;
I22SCLH=(11059200/400000+1)/2;/*设定I2C2时钟*/
I22SCLL=(11059200/400000)/2;
I22CONCLR=0x6c;
I22CONSET=0x40;
/*I2C2中断开启控制*/
VICIntSelect=0x00000000;/*设置所有通道为IRQ中断*/
VICVectPriority30=5;/*I2C2通道分配到IRQslot0,最高优先级*/
VICVectAddr30=(uint)IRQ_I2C2;/*设置I2C2中断向量*/
VICIntEnable=(1<<30);/*使能I2C2中断*/
}
/**************************************************************************
**函数名次:
延时程序。
**入口参数:
延时时间。
**出口参数:
无
**************************************************************************/
voidDelayNS(int32dly)
{
inti;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/**************************************************************************
**函数名次:
通用异步收发器(UART)0发送程序。
**入口参数:
无
**出口参数:
无
**************************************************************************/
int32sendchar(int32ch)
{/*WritecharactertoSerialPort*/
while(!
(U0LSR&0x20));
return(U0THR=ch);
}
/**************************************************************************
**函数名次:
IIC读程序,向AT24C02读出字节长度为len个字节。
**入口参数:
addr:
AT24C02器件物理地址,*dat:
将要写入数据缓冲区,len:
数据的长度。
**出口参数:
成功返回0
**************************************************************************/
ucharI2C2_ReadData(int32addr,uchar*dat,ucharlen)
{
if(len>0){
I2C_ADDR=AT24C16_addr+((addr>>7)&0x0e)+1;/*读器件的从地址,R=1*/
I2C_SUB_ADDR=addr&0xff;
I2C_BUF=dat;
I2C_NUM=len;
I2C_WR_EN=Read;
I2C_END=0;
/*清除STA,SI,AA标志位*/
I22CONCLR=(1<<2)|/*AA*/
(1<<3)|/*SI*/
(1<<5);/*STA*/
/*置位STA,启动I2C总线*/
I22CONSET=(1<<5)|/*STA*/
(1<<6);/*I2CEN*/
/*等待读操作完成*/
while(!
I2C_END);
}
return0;
}
/**************************************************************************
**函数名次:
IIC写程序,向AT24C02写入字节长度为len个字节
**入口参数:
addr:
AT24C02器件物理地址,*dat:
将要写入数据缓冲区,len:
数据的长度。
**出口参数:
成功返回0
**************************************************************************/
ucharI2C2_WriteData(int32addr,uchar*dat,ucharlen)
{
if(len>0){
I2C_ADDR=AT24C16_addr+((addr>>7)&0x0e);/*读器件的从地址,R=1地址长度8+X*/
I2C_SUB_ADDR=addr&0xff;
I2C_BUF=dat;
I2C_NUM=len;
I2C_WR_EN=Write;
I2C_END=0;
/*清除STA,SI,AA标志位*/
I22CONCLR=(1<<2)|/*AA*/
(1<<3)|/*SI*/
(1<<5);/*STA*/
/*置位STA,启动I2C总线*/
I22CONSET=(1<<5)|/*STA*/
(1<<6);/*I2CEN*/
/*等待写操作完成*/
while(!
I2C_END);
}
return0;
}
/**************************************************************************
**函数名次:
硬件I2C中断服务程序。
**入口参数:
无
**出口参数:
无
**************************************************************************/
/*Write2bytes:
0818282828
Read2bytes:
0818281040505058
sendchar()用于读取状态*/
void__irqIRQ_I2C2(void)
{
switch(I22STAT&0xf8)
{
case0x08:
/*已发送起始条件。
将发送从机地址+R/W位和接收ACK位。
*/
if(I2C_WR_EN==Read)/*指定子地址读*/
I22DAT=I2C_ADDR&0xfe;/*向I2DAT写入从机地址和R/W位*/
else/*指定子地址写*/
I22DAT=I2C_ADDR;/*向I2DAT写入从机地址和R/W位*/
I22CONSET=0x04;/*置位AA位*/
I22CONCLR=(1<<3)|(1<<5);/*清零SI,STA*/
break;
case0x10:
/*已发送重复起始条件。
将发送从机地址+R/W位和接收ACK位。
*/
I22DAT=I2C_ADDR;/*向I2DAT写入从机地址和R/W位*/
I22CONCLR=(1<<3)|(1<<5);/*清零SI,STA*/
break;
case0x18:
/*将发送数据字节,接收ACK位*/
if(I2C_WR_EN==Read)/*读指定地址,对地址进行处理*/
{
I22DAT=(I2C_SUB_ADDR&0xff);
I22CONCLR=0x28;/*清零SI,STA*/
//I22CONSET=0x20;/*重新启动*/
//I2C_WR_EN=Nothing_ToDo;
}
I22DAT=*I2C_BUF;/*向I2DAT装入主机发送缓冲区的下一个数据字节*/
I22CONSET=0x14;/*置位AA位*/
I22CONCLR=