打印
[Cortex-M0技术交流]

NUC-HOT助学板第二贴 ---I2C应用

[复制链接]
4235|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子write_cai|  楼主 | 2011-8-21 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 电子write_cai 于 2011-8-29 10:55 编辑

I2C实现与AT24C16通讯,利用9G的半主机调试
 
#include "main.h"
volatile  uint32_t  I2CDATA1;

void InitSYS()
{
UNLOCKREG();
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1);  //选择外部晶振;
DrvSYS_Delay(5000);
LOCKREG();
}
void InitGPIO()
{
  DrvGPIO_InitFunction( E_FUNC_I2C1);  //使能I2C功能;
}
void InitI2C()
{
  DrvI2C_Open(I2C_PORT1, 400000);         //打开I2C硬件并配置时钟总线400KHZ;
  DrvI2C_SetClockFreq (I2C_PORT1, 400000);//给I2C配置时钟频率;
  DrvI2C_GetStatus (I2C_PORT1);      //获取I2C状态码;
  DrvI2C_WriteData(I2C_PORT1, 0);    //写字节;
  DrvI2C_ReadData(I2C_PORT1);             //读字节;
  DrvI2C_Ctrl(I2C_PORT1, 0, 0, 0, 0);   //设定I2C控制位,包括控制寄存器中的STA, STO, AA, SI。
}
void Write_data(uint32_t address ,uint32_t data )
{
  uint32_t I2CDelay;
  DrvI2C_Open(I2C_PORT1, 400000);          //打开I2C硬件,并配置时钟总线400KHZ
  DrvI2C_Ctrl(I2C_PORT1, 1, 0, 0, 0);       //发送一个起始信号
  while(I2C1->CON.SI==0);
  DrvI2C_WriteData(I2C_PORT1, 0xA0);     //发送写命令;
  DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
  while(I2C1->CON.SI==0);
  DrvI2C_WriteData(I2C_PORT1, address);  //写地址;
  DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);
  while(I2C1->CON.SI==0);
  DrvI2C_WriteData(I2C_PORT1, data);        //写数据;
  DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);  //给响应并清除中断标志;
  while( I2C1->CON.SI == 0 );
  DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0); //清标志位 SI 并STOP
  for(I2CDelay=0;I2CDelay<50;I2CDelay++);
  DrvI2C_Close(I2C_PORT1);
  for(I2CDelay=0I2CDelay<6000;I2CDelay++);
  for(I2CDelay=0;I2CDelay<6000I2CDelay++);
}
uint32_t Read_data(uint32_t address,uint32_t wordaddress)
{
   uint32_t  I2CDATA=0;
   DrvI2C_Open(I2C_PORT1, 50000);
   DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);      //发送一个起始信号;
   while(I2C1->CON.SI==0);
   DrvI2C_WriteData(I2C_PORT1, 0xA0);    //写从机地址+写
   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);
   while(I2C1->CON.SI==0);
   DrvI2C_WriteData(I2C_PORT1, wordaddress); //写字地址;
   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);     //清除中断标志位并ACK;
   while(I2C1->CON.SI==0);
   DrvI2C_Ctrl(I2C_PORT1, 1, 0, 1, 0);     //设定I2C控制比特   START并清中断标志
   while( I2C1->CON.SI == 0 );
   DrvI2C_WriteData(I2C_PORT1, address++); //写地址+读;
   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 1);     //清标志位 SI 并使能应答
   while( I2C1->CON.SI == 0 );
   DrvI2C_Ctrl(I2C_PORT1, 0, 0, 1, 0);     //清标志位 SI
   while( I2C1->CON.SI == 0 );
   I2CDATA=DrvI2C_ReadData(I2C_PORT1);
   DrvI2C_Ctrl(I2C_PORT1, 0, 1, 1, 0);
   DrvI2C_Close(I2C_PORT1);
   return  I2CDATA;
}

int main ()
{
  InitSYS();
  InitGPIO();
  InitI2C();
  
  while(1)
  {
     
   Write_data(0x02,0x54);
   I2CDATA1=Read_data(0xA1,0x02);
   printf("%d\n\r",I2CDATA1);
  
  }

}



9G-NUC122.zip

197.7 KB

相关帖子

沙发
hotpower| | 2011-8-22 12:27 | 只看该作者
半主机应该给出裸照,再题目一个和I2C有些关联

使用特权

评论回复
板凳
mcsgy| | 2011-9-17 20:58 | 只看该作者
参考一下。

使用特权

评论回复
地板
tao560532| | 2011-9-18 16:22 | 只看该作者
高手,赞一个

使用特权

评论回复
5
wj4813308| | 2011-9-29 08:27 | 只看该作者

使用特权

评论回复
6
chenshichao541| | 2012-5-10 15:29 | 只看该作者
Write_data(0x02,0x54);

   I2CDATA1=Read_data(0xA1,0x02);

???怎么是这样额写法呢?LZ可以解释一下吗?不明白

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

157

主题

1534

帖子

3

粉丝