打印
[STM32F0]

从机发的第一个字节错误

[复制链接]
705|36
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyjie|  楼主 | 2022-5-7 22:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
基于HAL库做的I2C从机通信

使用特权

评论回复
沙发
chuxh| | 2022-5-7 22:51 | 只看该作者

什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
wyjie|  楼主 | 2022-5-7 22:53 | 只看该作者
一直不晓得I2C中断是拿来做什么的。

因为基本I2C都是主机是使用,不是使用E2PROM 就是一些传感器,直接配置他们,读取他们的数值便可。

后面想到I2C中断应该是作为从机的时候使用,因为不知道主机啥时候发信息过来,所以需要用到I2C的中断接收。
可是怎么使用他们的I2C中断接收?

使用特权

评论回复
地板
wyjie|  楼主 | 2022-5-7 22:55 | 只看该作者
在中断服务函数放些什么内容?

使用特权

评论回复
5
wyjie|  楼主 | 2022-5-7 22:56 | 只看该作者
?
调不通。

使用特权

评论回复
6
wyjie|  楼主 | 2022-5-7 22:58 | 只看该作者
有人测试过么?

使用特权

评论回复
7
juventus9554| | 2022-5-7 22:59 | 只看该作者
你可以到www.st.com/stm32 搜索下载STM32CubeF0固件包,里面有例程你可以试试学习、调试。

使用特权

评论回复
8
wyjie|  楼主 | 2022-5-7 23:02 | 只看该作者
没有看懂,我也将范例下载到板子上面了,然后用USB-I2C工具去访问那个I2C地址,发现仍然没有应答。

使用特权

评论回复
9
wyjie|  楼主 | 2022-5-7 23:04 | 只看该作者
范例上面也需要按键触发主机发送命令的,我也用了,仍然没有见到主机发送I2C命令。

使用特权

评论回复
10
wyjie|  楼主 | 2022-5-7 23:06 | 只看该作者
所以才没有办法,主机用CUBEMX 生产初始化代码,仍然没有应答。

使用特权

评论回复
11
wyjie|  楼主 | 2022-5-7 23:10 | 只看该作者
就是发现在CUBEMX里面设置好的地址,比如里面是0x07,实际在代码上面就是0x0e了。

使用特权

评论回复
12
wyjie|  楼主 | 2022-5-7 23:11 | 只看该作者
0111 变成了1110 变左移了1位。。

其他尝试了好几天无果。

使用特权

评论回复
13
wyjie|  楼主 | 2022-5-7 23:13 | 只看该作者
juventus9554 发表于 2022-5-7 22:59
你可以到www.st.com/stm32 搜索下载STM32CubeF0固件包,里面有例程你可以试试学习、调试。
...

测试过了,不通的。

使用特权

评论回复
14
wyjie|  楼主 | 2022-5-7 23:16 | 只看该作者
这样配置,有误?
用USB-I2C工具去测试,无论如何更改配置,MCU都无法产生ACK信号

使用特权

评论回复
15
wyjie|  楼主 | 2022-5-7 23:19 | 只看该作者

使用特权

评论回复
16
houcs| | 2022-5-7 23:21 | 只看该作者
// 中断如下。

void I2C1_IRQHandler(void)
{
  /* USER CODE BEGIN I2C1_IRQn 0 */
Flag=1;
  /* USER CODE END I2C1_IRQn 0 */
  if (hi2c1.Instance->ISR & (I2C_FLAG_BERR | I2C_FLAG_ARLO | I2C_FLAG_OVR)) {
    HAL_I2C_ER_IRQHandler(&hi2c1);
  } else {
    HAL_I2C_EV_IRQHandler(&hi2c1);
  }
  /* USER CODE BEGIN I2C1_IRQn 1 */

  /* USER CODE END I2C1_IRQn 1 */
}



//I2C初始化
void MX_I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x2000090E;
  hi2c1.Init.OwnAddress1 = 16;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
  {
    Error_Handler();
  }

}

空闲的时候SCL,SDA都为高电平。

发现只要用ox10的地址去写,SDA线还好,正常的电平为高。
SCL就一直是低的,只要把板子掉电才可以恢复为高。

怎么解呢?

应该是地址是匹配到了,但是为什么SCL一直为低了,说明了什么问题
如何进行下一步??

初始化的地址是0x10,这个地址去操作,SCL 就别拉低了。
但是如果用0x10之外的地址去操作, 总线正常的。怎么回事?

使用特权

评论回复
17
wyjie|  楼主 | 2022-5-7 23:22 | 只看该作者
主机发写命令后,是有进到中断的,测试LED灯已经点亮,就是SCL线一直为低,无法恢复,怎么处理?

使用特权

评论回复
18
wyjie|  楼主 | 2022-5-7 23:24 | 只看该作者

使用特权

评论回复
19
yszong| | 2022-5-7 23:28 | 只看该作者
I2C的中断服务应该至少有2个

使用特权

评论回复
20
houcs| | 2022-5-8 11:14 | 只看该作者
啥意思?不懂,能说明白一点么?

使用特权

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

本版积分规则

927

主题

12706

帖子

5

粉丝