嵌入式爱好者

查看: 4737|回复: 0

I2C问题

[复制链接]

11

主题

27

帖子

39

积分

扫一扫,手机访问本帖
发表于 2016-1-20 16:29:37 | 显示全部楼层 |阅读模式
void i2cint()
{
     GPD1_CON =0x22;//开启i2c0_SCL和i2c0_SDA
     GPD1_PUD =0x06;//设置上下拉寄存器
     I2CCON0 |=0xEF;//使能ACK,设置I2CCLK,Tx/Rx中断使能,中断清0,设置Ix clock。
     I2CSTAT0 =0x10;//串行输出使能
}
void i2c_write(int slave_addr, int addr, int data)
{
I2CDS0 = slave_addr;// 主机发送AT24LC01地址
I2CSTAT0 = 0xf0; //设置主机为发送模式产生START信号,串行输出使能(Tx/Rx)。
while ((I2CCON0 & 0x10) == 0);  // 等待数据发送 ?
while ((I2CSTAT0 & 0x1));  // 等待从机发来ACK ?

// 发地址和数据
I2CDS0 = addr;
I2CCON0 &= ~(1<<4);   //中断清零,从新开启I2C。     
while ((I2CCON0 & 0x10) == 0);     
while ((I2CSTAT0 & 0x1));
      
I2CDS0 = (data & 0x00FF);//发送一个字节数据
I2CCON0 &= ~(1<<4);  //中断清零,从新开启I2C。      
while ((I2CCON0 & 0x10) == 0);     
while ((I2CSTAT0 & 0x1));      
I2CSTAT0 = 0xD0; // 主机发stop,串行输出使能(Tx/Rx)。
I2CCON0 &= ~(1<<4); //中断清零,从新开启I2C。     
return;
}
int i2c_read(int slave_addr, int addr)
{
int data;
I2CDS0 = slave_addr;
// 主机发送AT24LC01地址
I2CSTAT0 = 0xf0;
while ((I2CCON0 & 0x10) == 0);  // 等待数据发送
while ((I2CSTAT0 & 0x1));  // 等待从机发来ACK
// 发地址和读数据 AT24LC01内部地址
I2CDS0 = addr;
I2CCON0 &= ~(1<<4);        
while ((I2CCON0 & 0x10) == 0);     
while ((I2CSTAT0 & 0x1));
data=I2CDS0 ;//读数拿
I2CSTAT0 = 0xd0;  // 主机发stop使能tx/rx
I2CCON0 &= ~(1<<4);  //中断清零   
return data;
}
void main(void)
{
     int i;
     /*1.设置GPD0CON为输入*/
     GPD0CON &= ~(0xF << 0);
     
     MP0_4CON = (MP0_4CON & ~0xFFFF0000) | 0x11110000;
     MP0_4PUD=(0x55<<16)&MP0_4PUD;
     MP0_4DAT |= 0xF0;
     clock_init();
      uart_init();
      i2cint();
     for(i=0;i<8;i++)
     {
      i2c_write(0xa0,i, 0);
        Delay(10);
        }
     for(i=0;i<8;i++)
     {
        UTXH3= i2c_read(0xa1, i);
          Delay(10);
       }
     return;
}
在给I2CDS0=(data&0x00FF)是什么意思,为什么不直接I2cDS0=data呢?
附1.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-20 19:11

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表