[Cortex-M0技术交流] NUC-HOT助学板第二贴 ---I2C应用

[复制链接]
 楼主| 电子write_cai 发表于 2011-8-21 11:44 | 显示全部楼层 |阅读模式
本帖最后由 电子write_cai 于 2011-8-29 10:55 编辑

I2C实现与AT24C16通讯,利用9G的半主机调试

  1. #include "main.h"
  2. volatile  uint32_t  I2CDATA1;

  3. void InitSYS()
  4. {
  5. UNLOCKREG();
  6. DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);  //选择外部晶振;
  7. DrvSYS_Delay(5000);
  8. LOCKREG();
  9. }
  10. void InitGPIO()
  11. {
  12.   DrvGPIO_InitFunction( E_FUNC_I2C1);  //使能I2C功能;
  13. }
  14. void InitI2C()
  15. {
  16.   DrvI2C_Open(I2C_PORT1, 400000);         //打开I2C硬件并配置时钟总线400KHZ;
  17.   DrvI2C_SetClockFreq (I2C_PORT1, 400000);//给I2C配置时钟频率;
  18.   DrvI2C_GetStatus (I2C_PORT1);      //获取I2C状态码;
  19.   DrvI2C_WriteData(I2C_PORT1, 0);    //写字节;
  20.   DrvI2C_ReadData(I2C_PORT1);             //读字节;
  21.   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 0, 0);   //设定I2C控制位,包括控制寄存器中的STA, STO, AA, SI。
  22. }
  23. void Write_data(uint32_t address ,uint32_t data )
  24. {
  25.   uint32_t I2CDelay;
  26.   DrvI2C_Open(I2C_PORT1, 400000);          //打开I2C硬件,并配置时钟总线400KHZ
  27.   DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0);       //发送一个起始信号
  28.   while(I2C1->CON.SI==0);
  29.   DrvI2C_WriteData(I2C_PORT1, 0xA0);     //发送写命令;
  30.   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
  31.   while(I2C1->CON.SI==0);
  32.   DrvI2C_WriteData(I2C_PORT1, address);  //写地址;
  33.   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);
  34.   while(I2C1->CON.SI==0);
  35.   DrvI2C_WriteData(I2C_PORT1, data);        //写数据;
  36.   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);  //给响应并清除中断标志;
  37.   while( I2C1->CON.SI == 0 );
  38.   DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //清标志位 SI 并STOP
  39.   for(I2CDelay=0;I2CDelay<50;I2CDelay++);
  40.   DrvI2C_Close(I2C_PORT1);
  41.   for(I2CDelay=0I2CDelay<6000;I2CDelay++);
  42.   for(I2CDelay=0;I2CDelay<6000I2CDelay++);
  43. }
  44. uint32_t Read_data(uint32_t address,uint32_t wordaddress)
  45. {
  46.    uint32_t  I2CDATA=0;
  47.    DrvI2C_Open(I2C_PORT1, 50000);
  48.    DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);      //发送一个起始信号;
  49.    while(I2C1->CON.SI==0);
  50.    DrvI2C_WriteData(I2C_PORT1, 0xA0);    //写从机地址+写
  51.    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
  52.    while(I2C1->CON.SI==0);
  53.    DrvI2C_WriteData(I2C_PORT1, wordaddress); //写字地址;
  54.    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);     //清除中断标志位并ACK;
  55.    while(I2C1->CON.SI==0);
  56.    DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);     //设定I2C控制比特   START并清中断标志
  57.    while( I2C1->CON.SI == 0 );
  58.    DrvI2C_WriteData(I2C_PORT1, address++); //写地址+读;
  59.    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);     //清标志位 SI 并使能应答
  60.    while( I2C1->CON.SI == 0 );
  61.    DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);     //清标志位 SI
  62.    while( I2C1->CON.SI == 0 );
  63.    I2CDATA=DrvI2C_ReadData(I2C_PORT1);
  64.    DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);
  65.    DrvI2C_Close(I2C_PORT1);
  66.    return  I2CDATA;
  67. }

  68. int main ()
  69. {
  70.   InitSYS();
  71.   InitGPIO();
  72.   InitI2C();
  73.   
  74.   while(1)
  75.   {
  76.      
  77.    Write_data(0x02,0x54);
  78.    I2CDATA1=Read_data(0xA1,0x02);
  79.    printf("%d\n\r",I2CDATA1);
  80.   
  81.   }

  82. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-8-22 12:27 | 显示全部楼层
半主机应该给出裸照,再题目一个和I2C有些关联
mcsgy 发表于 2011-9-17 20:58 | 显示全部楼层
参考一下。
tao560532 发表于 2011-9-18 16:22 | 显示全部楼层
高手,赞一个
wj4813308 发表于 2011-9-29 08:27 | 显示全部楼层
chenshichao541 发表于 2012-5-10 15:29 | 显示全部楼层
Write_data(0x02,0x54);

   I2CDATA1=Read_data(0xA1,0x02);

???怎么是这样额写法呢?LZ可以解释一下吗?不明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:只要你是拼多多新用户就可以加我微信,微信号772880135验证您是新用户后立刻微信转你20元。欢迎朋友加我微信,多年21ic用户,诚信为本!

157

主题

1534

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部