ARM的IIC

来源:互联网 发布:mac obs 插件 编辑:程序博客网 时间:2024/05/17 02:18
#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);}
0 0
原创粉丝点击