|
I2C是一种两线串行总线,结构简单,可以直接使用导线连接各个设备,简化系统的硬件设计.需要注意的是I2C接口为开漏输出,需要上来电阻.
程序设计的步骤分别为
1初始化端口功能和I2C时钟设置
PINSEL0=(PINSEL0&0xffffff0f)|0x50; /*设置I2C控制口有效*/
/* 设置I2C时钟为100KHz */
// 晶振为12MHz,Fpclk = 15MHz,I2C时钟速率=15M/30=100k
I2C0SCLH=(FOSC/FI2C0+1)/2; /*设置I2C时钟为fi2c*/
I2C0SCLL=(FOSC/FI2C0)/2;
I2C0CONCLR = STA|SI|AA|STO;
I2C0CONSET = I2CEN; //I2EN=1,使能I2C功能
2 根据寄存器说明和I2C时序要求写好发送函数与接收函数
/*************************发送起始信号*********************/
void I2C_Start(void)
{
I2C0CONSET = STA; //启动发送START脉冲
//I2CONSET=SI; //发送完起始位会自动置1
do{}while(0x08!=I2C0STAT); //等待完成start脉冲发送
I2C0CONCLR = STA; //清除STA位,结束过程
}
/*****************发送结束信号*********************/
void I2C_Stop(void)
{
I2C0CONSET = STO; //启动发送STop脉冲,STO位是自动清除的.不必判断是否结束
I2C0CONCLR = SI; //只能清除SI,清除STO还是会有影响,STO同时清除,返回到初始化的状态
}
/************************延时*********************************/
void DelayMs(unsigned int dly)
{ unsigned int i;
for(; dly>0; dly--)
for(i=0; i<1000; i++);
}
/***************写8位数据*****************************/
void WriteByte(unsigned char data)
{
I2C0DAT = data;
I2C0CONCLR = SI; //启动发送
}
/***************写器件地址和读写信号*****************************/
void WriteAddr(unsigned char ReadMode)
{
WriteByte(C02MasterAddr+ReadMode);
if(ReadMode) do{}while(I2C0STAT!=0x40); //等待器件地址和读信号完成
else do{}while(I2C0STAT!=0x18); //等待器件地址和写信号完成
}
/***************写数据*****************************/
void WriteData(unsigned char data)
{
WriteByte(data);
do{} while(I2C0STAT!=0x28); //等待写数据完成
}
/***************读8位数据*****************************/
unsigned char ReadByte(unsigned char last) //last:最后一位数据
{
if(last)
{
I2C0CONCLR=AA;
I2C0CONCLR=SI; //启动接收最后数据
do{}while(I2C0STAT!=0X58);
}
else
{
I2C0CONSET=AA;
I2C0CONCLR=SI; //启动接收数据
do{}while(I2C0STAT!=0X50);
}
return I2C0DAT;
}
/***************写num个字节到24c02*****************************/
void WriteC02(unsigned char num)
{
unsigned char i=0;
I2C_Start();
WriteAddr(WRMode); //写地址和写模式
WriteData(C02SlaveAddr); //24c02的存储地址
//for(i=0;i<4;i++) I2C_buf1[i]=i+5; //I2C_buf初始化
for(i=0;i<num;i++)
{
WriteData(I2C_buf1[i]);
}
I2C_Stop();
DelayMs(10); // 延时等待eeprom写操作
//把写到I2C上的数据在串口上打印出来
DelayMs(100);
puts(" \nWrite to I2C BUS:");
for(i=0;i<num;i++)
{
putchar(I2C_buf1[i]);
puts("\n");
}
}
/******************从24c02地址读num个字节数据************/
void ReadC02(unsigned char num)
{
unsigned char i=0;
I2C_Start();
WriteAddr(WRMode);
WriteData(C02SlaveAddr);
I2C_Stop();
I2C_Start();
WriteAddr(RDMode);
for(i=0;i<num;i++) I2C_buf2[i]=0;//清0
for(i=0;i<num-1;i++)
{
I2C_buf2[i]=ReadByte(!lastbyte);
}
I2C_buf2[num]=ReadByte(lastbyte);
I2C_Stop();
//把从I2C上读到的数据在串口上打印出来
puts(" \nRead form I2C BUS:\n");
for(i=0;i<num;i++)
{
putchar(I2C_buf2[i]);
puts("\n");
}
}
下面我们就往24C04写入EEWORLD这几个字,再读出来.