#include<nxp/iolpc2378.h>
#define STA (1<<5)
#define I2CEN (1<<6)
#define STO (1<<4)
#define SI (1<<3)
#define AA (1<<2)
#define WRMode 0 //写控制位
#define RDMode 1 //读控制位
#define C02MasterAddr 0xA0 //24c02的器件地址
#define C02SlaveAddr 0 //24c02的子地址
#define lastbyte 1 //最好一位标志位
typedef unsigned char euint8;
typedef unsigned int euint32;
char j=1;
euint8 I2C_buf1[10];
euint8 I2C_buf2[10];
euint8 i;
/*延时函数*/
void delayMs(euint32 dly)
{
euint32 i;
for(;dly>0;dly--)
{
for(i=0;i<1000;i++);
}
}
/*I2C总线初始化*/
void I2C_Init(void)
{
// PCONP |= ( 1 << 19); //功率寄存器使能
// PINSEL1 |= ( 3 << 6 )|( 3 << 8 ); //P0.19:SDA1 P0.20:SCL1
// PINSEL1=0X03C0;
// I21ADR = C02MasterAddr;
I21SCLL =I21SCLH= 14;
I21CONCLR=STA|SI|AA|STO;
I21CONSET=I2CEN;
// I21SCLL =I21SCLH= 14;
}
/*发送起始位*/
void I2C_Start(void)
{
I21CONSET=STA; //启动发送start脉冲
// I21CONSET=SI; //发送完起始位会自动置1
do{} while(0x08!=I21STAT); //等待完成start脉冲发送
I21CONCLR=STA;//清除STA位,结束过程
}
/*发送停止位*/
void I2C_Stop(void)
{
I21CONSET=STO;//启动发送stop自动清除
I21CONSET=AA;
I21CONCLR=SI;
}
/*写8位数据*/
void writebyte(euint8 data)
{
I21DAT=data;
I21CONSET=AA;
I21CONCLR=SI; //启动发送
}
/*写数据*/
void writedata(euint8 data)
{
writebyte(data);
do{} while(I21STAT!=0x28);// 等待写数据完成
}
/*写器件地址和读写信号*/
void writeAddr(euint8 ReadMode)
{
writebyte(C02MasterAddr+ReadMode);
if(ReadMode)
{
do{}while(I21STAT != 0X40); //等待器件地址和读信号完成
}
else do{}while(I21STAT != 0x18); //等待器件地址和写信号完成
}
/*读8位数据*/
euint8 readbyte(euint8 last) //last:最后一位数据
{
if(last)
{
I21CONCLR=AA;
I21CONCLR=SI; //启动接受最后数据
do {} while(I21STAT!=0X58);
}
else
{
I21CONSET=AA;
// I21CONSET=STO;
I21CONCLR=SI; //启动接受数据
do{} while(I21STAT!=0X50);
}
return I21DAT;
}
/*写四个字节到24c02*/
void writec02()
{
euint8 i;
I21CONCLR=STA|SI|AA|STO;
I21CONSET=I2CEN;
I2C_Start();
writeAddr(WRMode); //写地址和写模式
writedata(C02SlaveAddr); //23c02的存储地址
for(i=0;i<4;i++) I2C_buf1[i]=i+5; //I2C_buf初始化
for(i=0;i<4;i++)
{
writedata(I2C_buf1[i]);
}
I2C_Stop();
delayMs(100); //延时等待EEPROM写操作
}
/*从23c02地址读四个字节数据*/
void readc02()
{
euint8 i;
I21CONCLR=STA|SI|AA|STO;
I21CONSET=I2CEN;
I2C_Start();
writeAddr(WRMode);
writedata(C02SlaveAddr);
I2C_Stop();
I2C_Start();
writeAddr(RDMode);
for(i=0;i<4;i++) I2C_buf2[i]=0;
for(i=0;i<3;i++)
{
I2C_buf2[i]=readbyte(!lastbyte);
}
I2C_buf2[3]= readbyte(lastbyte);
I2C_Stop();
}
/*主函数初始化*/
void sys_init(void)
{
//使用GPIO功能,将所用的管脚连接到GPIO
PINSEL0=0X00000000;
PINSEL1=0X00000000;
FIO2DIR=1<<13;
FIO2SET=1<<13;
}
void delay (unsigned int n)
{
while(n--);
}
void bell(void)
{
sys_init();
FIO2CLR=1<<13;
delay(1000);
FIO2SET=1<<13;
}
void main()
{
PINSEL1=0X000003C0;
I2C_Init();
writec02(); //向24c02写4个字节数据
delayMs(1000);
readc02(); //从 24c02把写进去的数据读出来
delayMs(1000);
for(i=0;i<4;i++)
{
if(I2C_buf2[i]==I2C_buf1[i])
j=2;
}
while(j==2)
{
bell();//蜂鸣器象
delayMs(1000);
}
}
大虾们看看程序有什么错误,开发环境是IAR,向ATC256里面写数据然后回读,但是结果不一样,期待求解…… |