初音ミクゥゥゥ 2022-07-11 12:01 采纳率: 0%
浏览 269

I2C协议验证总是失败,求解答

最近公司需要用到IIC协议通讯,我在验证IIC通讯时一直碰到验证不成功的问题,具体的信息如下:
所用主芯片是STM32H745XIH6U,FRAM设备用的FM24CL64B(从机)

协议代码使用cubemx生成,具体的软硬件配置如下图所示:

img


这里配置圆圈内内容后,波浪线的数值变为红色提示错误,然后cubemx自动纠正了:

img


根据H745电路图中如下两图所示,得知CN7引出的5和6针脚就是IIC协议的PD13,PD12:

img


img


下图为FM24CL的接线图,可知3 5是I2C协议所用针脚

img


于是开始配置I2C4:

img


软件的配置我是参考了https://jeckxu666.blog.csdn.net/article/details/117253441做的,最后按配置生成代码

然后是物理连线,根据上图H745和FM24的电路图接线如下(棕色红色为地线和供电):

img


img

然后在keil5中打开上面生成的代码,main.c中添加测试用例如下:

首先在BEGIN PV中定义传参

/* USER CODE BEGIN PV */
#define Write_ADDR 0xAE
#define Read_ADDR 0xAF

unsigned char str1[]={"i2ctest1"};
unsigned char str2[]={"i2ctest2"};
unsigned char str3[]={"i2ctest3"};

uint8_t ReadBuffer[50];

然后在main函数中添加如下代码:

/* USER CODE BEGIN 2 */
    int i=5;int j =5;int k=5;
    HAL_Delay(100);

    //阻塞方式写入读取
    if(HAL_I2C_Mem_Write(&hi2c4,Write——ADDR,0,I2C_MEMADD_SIZE_8BIT,str1,sizeof(str1),1000)==HAL_OK)
        {i=6;}else{i=7;}
    HAL_Delay(1000);
    HAL_I2C_Mem_Read(&hi2c4,Read_ADDR,0,I2C_MEMADD_SIZE_8BIT,ReadBuffer,sizeof(str1),1000);
    HAL_Delay(1000);

    //中断方式写入读取
    if(HAL_I2C_Mem_Write_IT(&hi2c4,Write_ADDR,0,I2C_MEMADD_SIZE_8BIT,str2,sizeof(str2))==HAL_OK)
        {j=6;}else{j=7;}
    HAL_Delay(1000);
    HAL_I2C_Mem_Read_IT(&hi2c4,Read_ADDR,0,I2C_MEMADD_SIZE_8BIT,ReadBuffer,sizeof(str2));
    HAL_Delay(1000);

    //DMA中断方式写入读取
    if(HAL_I2C_Mem_Write_DMA(&hi2c4,Write_ADDR,0,I2C_MEMADD_SIZE_8BIT,str3,sizeof(str3))==HAL_OK)
        {k=6;}else{k=7;}
    HAL_Delay(1000);
    HAL_I2C_Mem_Read_DMA(&hi2c4,Read_ADDR,0,I2C_MEMADD_SIZE_8BIT,ReadBuffer,sizeof(str3));
    HAL_Delay(1000);
  /* USER CODE END 2 */

说明一下。读写地址为AE和AF是因为FM24的接线图如下图:

img


我的理解是用来决定从设备地址的那几根线全部接到供电线上了,所以全部是1,也就是说地址是0xAE和0xAF。

然后编译,下载到H745中都没问题,最后跑起来调试时,watch窗口查看ijk三个变量的值,结果全都从5变成了7,说明确实被执行了但全都失败了。
由于我本人之前是搞软件开发的没接触过嵌入式,所以偏向于从软件层面思考解决方案。我打断点调试,函数执行的路径如下:
HAL_I2C_Mem_Write→I2C_RequestMemoryWrite→I2C_WaitOnTXISFlagUntilTimeout→I2C_IsErrorOccurred
执行过程在I2C_IsErrorOccurred函数中的详细步骤如下:
1.进入6423行while (__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_TXIS) == RESET)语句,然后进行到6432行if (Timeout != HAL_MAX_DELAY)判断语句
2.循环至6426行if (I2C_IsErrorOccurred(hi2c, Timeout, Tickstart) != HAL_OK)语句并进入该函数
3.到达6575行if (HAL_IS_BIT_SET(itflag, I2C_FLAG_AF))进入该语句,该语句最终导致了I2C_IsErrorOccurred函数返回HAL_ERROR导致写函数执行失败。
失败的原因到底是什么?上面define的地址我不光试了AE和AF,从A0到A8我也全部试了,全都不行。是因为TXIS,itflag或者FALG_AF这三个变量中的哪一个不对么?或者说不是软件的问题,是硬件上我哪里搞错了?

现在就想让H745和FM24成功用I2C协议通讯上,达成H745对FM24进行读和写的操作

  • 写回答

3条回答 默认 最新

  • wwc2017 2022-07-11 14:59
    关注

    我只说一下我调试的经历,看能不能帮到你
    之前调试I2C设备时,按照协议调了很久,感觉完全符合协议要求,但设备就是不返回数据。后来把设备断电,重新上电运行了一下,就好了。应该是之前调试发送了错误的信号给设备,使设备的I2C一直处于错误的状态,重新上电后就恢复了。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月11日

悬赏问题

  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)