ARM的IIC

#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);
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值