#define GPD1CON (*(volatile unsigned int *)0xE02000C0)
#define I2CCON0 (*(volatile unsigned int *)0xE1800000)
#define I2CDS0 (*(volatile unsigned int *)0xE180000C)
#define I2CSTAT0 (*(volatile unsigned int *)0xE1800004)
void i2c_init(void)
{
/*1.设置GPIO控制为i2c*/
GPD1CON &= ~(0xff << 0);
GPD1CON |= (0x22 << 0);
/*2.开启中断,设置时钟*/
I2CCON0 = 0xe0;
}
/*读数据操作*/
void i2c_atc24c0_read(unsigned char addr,char *data)
{
/*********第一阶段**************/
/*1.装载i2c设备地址*/
I2CDS0 = 0xa0;
/*2.设置主机为发送模式,发送START信号*/
I2CSTAT0 = 0xf0;
/*3.等待接收ACK校验,判断I2CCON0的第四位是否为1(有中断发生)*/
while(!(I2CCON0 & (0x1 << 4)));
/*4.清楚标记,恢复操作*/
I2CCON0 &= ~(0x1 << 4);
/*********第二阶段**************/
/*5.发送read设备的地址*/
I2CDS0 = addr;
while(!(I2CCON0 & (0x1 << 4))); //等待接收ACK校验
I2CCON0 &= ~(0x1 << 4); //清楚标记,恢复操作
/*********第三阶段**************/
/*6.装载从机的设备地址(片内地址)*/
I2CDS0 = (0xa0 | (0x1 << 0));
/*7.设置主机为接收模式,发送START信号*/
I2CSTAT0 = 0xb0;
while(!(I2CCON0 & (0x1 << 4))); //等待接收ACK校验
I2CCON0 &= ~((0x1 << 4) | (0x1 << 7)); //清楚标记,恢复操作
/*********第四阶段**************/
while(!(I2CCON0 & (0x1 << 4))); //等待接收ACK校验
*data = I2CDS0;
I2CCON0 &= ~(0x1 << 4); //清楚标记,恢复操作
/*8.发送stop信号*/
I2CSTAT0 = ~(0x1 << 5);
}
/*写操作*/
void i2c_atc24c0_write(unsigned char addr,char data)
{
/**********第一阶段**********/
/*1.装载设备地址*/
I2CDS0 = 0xa0;
/*2.主机设置为发送模式,发送START信号*/
I2CSTAT0 = 0xf0;
/*3.等待接收ACK校验,判断I2CCON0的第四位是否为1(有中断发生)*/
while(!(I2CCON0 & (0x1 << 4)));
/*4.清楚标记,恢复操作*/
I2CCON0 &= ~(0x1 << 4);
/**********第二阶段**********/
/*5.主机发送写入的地址*/
I2CDS0 = addr;
while(!(I2CCON0 & (0x1 << 4))); //等待接收ACK校验
I2CCON0 &= ~(0x1 << 4); //清楚标记,恢复操作
/**********第三阶段**********/
/*6.主机发送数据*/
I2CDS0 = data;
while(!(I2CCON0 & (0x1 << 4))); //等待接收ACK校验
I2CCON0 &= ~(0x1 << 4); //清楚标记,恢复操作
/*8.发送stop信号*/
I2CSTAT0 = ~(0x1 << 5);
}
ARM的IIC
最新推荐文章于 2022-09-20 20:52:50 发布