受不了简易IIC了,终于调试出来了!
 
					
				使用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对时序要求严格 也频率高 调试时候设置断点一定要注意
 
					
				 
					
				回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |


 
			
			
			
						
			 
					
				 
					
				 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

