24c01存储器读写代码.docx

上传人:b****3 文档编号:10345280 上传时间:2023-05-25 格式:DOCX 页数:17 大小:19.19KB
下载 相关 举报
24c01存储器读写代码.docx_第1页
第1页 / 共17页
24c01存储器读写代码.docx_第2页
第2页 / 共17页
24c01存储器读写代码.docx_第3页
第3页 / 共17页
24c01存储器读写代码.docx_第4页
第4页 / 共17页
24c01存储器读写代码.docx_第5页
第5页 / 共17页
24c01存储器读写代码.docx_第6页
第6页 / 共17页
24c01存储器读写代码.docx_第7页
第7页 / 共17页
24c01存储器读写代码.docx_第8页
第8页 / 共17页
24c01存储器读写代码.docx_第9页
第9页 / 共17页
24c01存储器读写代码.docx_第10页
第10页 / 共17页
24c01存储器读写代码.docx_第11页
第11页 / 共17页
24c01存储器读写代码.docx_第12页
第12页 / 共17页
24c01存储器读写代码.docx_第13页
第13页 / 共17页
24c01存储器读写代码.docx_第14页
第14页 / 共17页
24c01存储器读写代码.docx_第15页
第15页 / 共17页
24c01存储器读写代码.docx_第16页
第16页 / 共17页
24c01存储器读写代码.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

24c01存储器读写代码.docx

《24c01存储器读写代码.docx》由会员分享,可在线阅读,更多相关《24c01存储器读写代码.docx(17页珍藏版)》请在冰点文库上搜索。

24c01存储器读写代码.docx

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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2