这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » 受不了简易IIC了,终于调试出来了!

共7条 1/1 1 跳转至

受不了简易IIC了,终于调试出来了!

高工
2012-09-02 18:10:30     打赏
麻烦死了! 
还找不到例子!



关键词: 受不了     简易     终于     调试     出来了    

高工
2012-09-02 19:31:19     打赏
2楼

使用Applilet设置IIC00

一定要注意的是 不能照搬IICA0的相关函数
最主要的原因在于


需要手动产生开始条件和停止条件
但是令人不爽的是 自动代码生成的函数说明中

发送函数中内部包含了开始条件
但是 但是! 没有停止条件?!
这就要求我们自己设置停止?

于是 在发送完数据后 要自己调用 IIC00_StopCondition( ) 函数 而且貌似还得要延时
读取的时候就更费解了 
首先是发送读取的AT24C02内部地址
但是 但是 发送完成之后 还要自己调用IIC00_StopCondition( ) !!
最后才是调用接收函数 IIC00_MasterReceiveStart( )
否则老是出现
if ((IICBSY0 == 0U) && (gIica0TxCnt != 0U))
 {
  IICA0_MasterErrorCallback(MD_SPT);
 }



主要代码如下:
void  main(void)
{
 /* Start user code. Do not edit comment generated here */
   initWriteBuff();
 fullWriteBuff();
 // 先点亮LED 灯
 PORT_ChangeP77Output(0);
   // 先写入
 // 设置读写地址
 SetRWAddress(0x20);
 
 // 测试简化功能IIC mcu只能做主机
 // 先加入停止模式 稳定多了
 IIC00_StopCondition();
 IIC00_Stop();
 simpleDelay(); 
 // 发送数据
 IIC00_MasterSendStart
 (
     EEPROM_DEVICE_ADDRESS,   // 0xA0
  write_buffer,
   EEPROM_NUMB_WRITE   // 9 算上存储单元地址
 );
 // 循环等待发送完成
 while(IIC0SendFlag == 0)
 {
    NOP();
 }
 IIC0SendFlag = 0;
 
 // 熄灭LED 灯
 // 1
 simpleDelay();
 simpleDelay();
 simpleDelay();
 simpleDelay(); 
 simpleDelay(); 
 simpleDelay();
 PORT_ChangeP77Output(1);
 // 为了继续别的操作
 // 必须先进行停止?
 // 同样的 前面的延时也很重要?!
 IIC00_StopCondition();
 

 simpleDelay(); 
 simpleDelay();
 simpleDelay();
 simpleDelay();
 simpleDelay();
 PORT_ChangeP77Output(0);
 
 // 先发送器件地址及存储地址
 
 IIC00_MasterSendStart
 (
     EEPROM_DEVICE_ADDRESS,   // 0xA0
  write_buffer,
  EEPROM_WORD_ADDRESS  // 1 算上存储单元地址
 );
 /*
 // 2
  // 方案1
 while(--_delay);
 while(--_delay);
 while(--_delay);
 // 必须先手动停止?
 // 延时长度很重要!!
 IIC00_StopCondition();
 */ 
 // 或者方案2
 // 延时或者循环等待的目的是为了等到内部地址发送完成之后才停止
 while(IIC0SendFlag == 0) 
 {
    NOP();
 }
 IIC00_StopCondition();  
 
 // 读取数据
 IIC00_MasterReceiveStart
 (
  EEPROM_DEVICE_ADDRESS,
  read_buffer,
  EEPROM_RECEIVE_COUNT   // 8 不算存储单元地址
 );
 while(IIC0RevFlag == 0)
 {
    NOP();
 }
 IIC0SendFlag = 0;
 IIC0RevFlag = 0;
 simpleDelay(); 
 simpleDelay();
 simpleDelay();
 simpleDelay();
 simpleDelay();
 PORT_ChangeP77Output(1);
 IIC00_StopCondition(); 
 // 通过串口发送出读取到的数据
 UART2_Start();
 UART2_SendData(read_buffer, 8);
 while (1U)
 {
    // 调试时候 发现 系统在while循环空闲等待的时候 完成了后继 IIC 数据的接收
  NOP();
 }
}


注意IIC的借口使用的是P10 P11 在J1引脚上

PS : jobs 提醒说由于IIC对时序要求严格 也频率高 调试时候设置断点一定要注意


院士
2012-09-02 19:56:01     打赏
3楼
不着急,不气馁

高工
2012-09-02 21:01:45     打赏
4楼
待认证,前段时间弄了一天没弄成,谢分享

高工
2012-09-02 21:20:57     打赏
5楼

我也是整了一下午才尝试出来的 我把AT24C02的数据按照12345678填充了好多


高工
2012-09-02 23:57:49     打赏
6楼
IIC如果是虚拟的直接copy51的代码出来改一下吧,硬的就按照datasheet配置,不用着急,要淡定

专家
2012-09-03 10:37:30     打赏
7楼
用中断的话得配置好寄存器参数

共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]