ST意法半导体
直播中

戚歆敦

7年用户 984经验值
私信 关注
[问答]

I2C设备在IAR发布模式下没有信号是怎么回事呢

我想使用 bluenrg-355MT 访问 i2c 设备,我在 bluenrg_lp_evb_i2c 文件中使用 BlueNRG-LP DK 1.0.0 的函数。当我下载和调试时,i2c 工作正常,但在发布模式下没有 i2c 信号。
这是我检测光传感器的代码:
  • BSP_I2C_Init();
  • HAL_StatusTypeDef ret;
  • ret = HAL_I2C_IsDeviceReady(&hi2cx, 0x10<<1, 1, 10);
  • if( ret != HAL_OK )
  •     printf("Device not present.rn");
  • else
  •     printf("Light sensor detected.rn");
无论参数如何,都没有信号。
I2C 配置如下:
  • /* Initialize the GPIOs associated to the I2C port */
  • BSP_I2C_DATA_GPIO_CLK_ENABLE();
  • LL_GPIO_SetPinMode(BSP_I2C_DATA_GPIO_PORT, BSP_I2C_DATA_PIN, LL_GPIO_MODE_ALTERNATE);
  • LL_GPIO_SetPinSpeed(BSP_I2C_DATA_GPIO_PORT, BSP_I2C_DATA_PIN, LL_GPIO_SPEED_FREQ_HIGH);
  • LL_GPIO_SetPinOutputType(BSP_I2C_DATA_GPIO_PORT, BSP_I2C_DATA_PIN, LL_GPIO_OUTPUT_OPENDRAIN);
  • LL_GPIO_SetPinPull(BSP_I2C_DATA_GPIO_PORT, BSP_I2C_DATA_PIN, BSP_I2C_DATA_GPIO_PULL);
  • BSP_I2C_DATA_GPIO_AF();
  • BSP_I2C_CLK_GPIO_CLK_ENABLE();
  • LL_GPIO_SetPinMode(BSP_I2C_CLK_GPIO_PORT, BSP_I2C_CLK_PIN, LL_GPIO_MODE_ALTERNATE);
  • LL_GPIO_SetPinSpeed(BSP_I2C_CLK_GPIO_PORT, BSP_I2C_CLK_PIN, LL_GPIO_SPEED_FREQ_HIGH);
  • LL_GPIO_SetPinOutputType(BSP_I2C_CLK_GPIO_PORT, BSP_I2C_CLK_PIN, LL_GPIO_OUTPUT_OPENDRAIN);
  • LL_GPIO_SetPinPull(BSP_I2C_CLK_GPIO_PORT, BSP_I2C_CLK_PIN, BSP_I2C_CLK_GPIO_PULL);
  • BSP_I2C_CLK_GPIO_AF();
  • /* Initialize the I2C clock */
  • BSP_I2C_CLK_ENABLE();
  • LL_I2C_Disable(BSP_I2C);
  • /* Configure the SDA setup, hold time and the SCL high, low period
  • * For Fast-mode 400 kHz, PRESC | 0h | SCLDEL | SDADEL | SCLH | SCLL
  • *                          1h  | 0h |    3h  |   2h   |  03h |  09h
  • */
  • LL_I2C_SetTiming(BSP_I2C, 0x10320309);
  • /* Enable Clock stretching */
  • LL_I2C_EnableClockStretching(BSP_I2C);
  • /* Enable Peripheral in I2C mode */
  • LL_I2C_SetMode(BSP_I2C, LL_I2C_MODE_I2C);
  • /* Enable the I2C peripheral */
  • LL_I2C_Enable(BSP_I2C);
其 I2C1 CLK-PA0 DATA-PA1
调试模式是否可以通过启用所有时钟和电源路径来强制外设工作,所以我忘了启用某些东西?或者从 µC 配置的角度来看,发布和调试之间有什么区别?
谢谢你的帮助,




回帖(1)

尚文忠

2022-12-21 10:08:34
我猜这种行为与 PA0 和 PA1 有关。让我在这里分享我的假设。
我想您正在使用 ST-Link 作为调试/闪存探测器。
其实PA0和PA1也是JTAG管脚。
ST-Link 探针正在发送特定序列,导致为 JTAG 重新配置 PA1/PA0。
遗憾的是,此 JTAG 配置 只能通过 PowerOnReset清除。HW_Reset 不会影响 JTAG 配置,解释您注意到的行为。
闪烁后,如果您执行上电复位(板上电源关闭),您的 I2C 应该按照您在调试模式下看到的那样运行。
这种 SWD 到 JTAG 的特定序列出现在任何 ST-Link 操作(例如调试或编程)的末尾。
只有上电序列才能擦除 JTAG 配置...因此需要上电复位以重新启动应用程序。
我知道关闭电源和打开电源这很烦人。因此,在这种情况下,我建议使用另一个调试器作为解决方案。
我可以根据 BlueNRG-LP 评估板上的默认探针使用建议使用 CMSIS DAP 调试器:STEVAL-IDB011V1 板。
您还可以使用 UART 引导加载程序刷新二进制文件。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分