你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0 SMBus 中断怎么开启

[复制链接]
q289466080 提问时间:2024-10-31 18:53 / 未解决

STM32F0 用cubemx生成的SMBus-Alert-mode,cubemx中中断使能开启了,现在问题接收不到数据,初始化中增加了一下代码

  __HAL_SMBUS_GET_IT_SOURCE(&hsmbus1,SMBUS_FLAG_RXNE);
  __HAL_SMBUS_GET_IT_SOURCE(&hsmbus1,SMBUS_FLAG_ADDR);
  __HAL_SMBUS_GET_IT_SOURCE(&hsmbus1,SMBUS_FLAG_STOPF);
  __HAL_SMBUS_GET_IT_SOURCE(&hsmbus1,SMBUS_FLAG_TC);


  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_ERRI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_TCI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_STOPI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_NACKI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_ADDRI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_RXI);
收藏 评论4 发布时间:2024-10-31 18:53

举报

4个回答
xmshao 回答时间:2024-11-1 10:48:01
你目前代码的确是开启了相关事件的中断请求能力的,同时你说在cubeMx界面也使能了I2c所有中断响应,那么
发生相应事件时应该是可以触发中断并进入中断服务程序的。


当然,当我们基于非阻塞式调用ST 固件库中相应中断型API函数时,API函数里也会针对性使能相关中断请求,比方下面这些:


HAL_SMBUS_Master_Transmit_IT();
HAL_SMBUS_EnableListen_IT();
HAL_SMBUS_Master_Receive_IT();
HAL_SMBUS_Slave_Transmit_IT();
HAL_SMBUS_EnableListen_IT();


。。。。。。这些在库函数都有罗列和介绍。


虽说,你现在选择的SMBUS  ALERT模式及接口,基本的还是I2C通信协议。


MBus协议定义了多种命令,用于设备之间的通信。每个设备可以使用下面的任意一种或多种协议进行通信。这些协议包括:


Quick Command
Send Byte
Receive Byte
Write Byte
Write Word
Read Byte
Read Word
Process Call
Block Read
Block Write
Block Write-Block Read Process Call


这些命令在SMBUS的协议里有明确的格式定义与说明,到http://smbus.org就可以下载。
q289466080 回答时间:2024-11-1 16:53:02

xmshao 发表于 2024-11-1 10:48
你目前代码的确是开启了相关事件的中断请求能力的,同时你说在cubeMx界面也使能了I2c所有中断响应,那么
发 ...

您好, 可以在中断里面获取数据吗?,怎么设置的可以发个范例吗?

xmshao 回答时间:2024-11-1 17:33:43

q289466080 发表于 2024-11-1 16:53
您好, 可以在中断里面获取数据吗?,怎么设置的可以发个范例吗?
...

肯定可以基于中断方式进行通信,即收发的。先从最基本的读写做起,库里都有中断方式的读写例程。

q289466080 回答时间:2024-11-4 15:06:01

xmshao 发表于 2024-11-1 17:33
肯定可以基于中断方式进行通信,即收发的。先从最基本的读写做起,库里都有中断方式的读写例程。
[/m ...

[md]改2个地址就可以,参考STM32_AN4502_FW_V2.0.3,这份档案,是PMUbs从机

smbus初始化

void MX_I2C1_SMBUS_Init(void) //i2c.c中
{
  /* USER CODE BEGIN I2C1_Init 0 */
  /* USER CODE END I2C1_Init 0 */
  /* USER CODE BEGIN I2C1_Init 1 */
  /* USER CODE END I2C1_Init 1 */
  hsmbus1.Instance = I2C1;
  hsmbus1.Init.Timing = 0x10805D88;                         //100K
  hsmbus1.Init.AnalogFilter = SMBUS_ANALOGFILTER_ENABLE;
  hsmbus1.Init.OwnAddress1 = 2;
  hsmbus1.Init.AddressingMode = SMBUS_ADDRESSINGMODE_7BIT;
  hsmbus1.Init.DualAddressMode = SMBUS_DUALADDRESS_ENABLE;  //2个地址
  hsmbus1.Init.OwnAddress2 = 0x40U;                         //
  hsmbus1.Init.OwnAddress2Masks = SMBUS_OA2_MASK05;         //
  hsmbus1.Init.GeneralCallMode = SMBUS_GENERALCALL_DISABLE;
  hsmbus1.Init.NoStretchMode = SMBUS_NOSTRETCH_DISABLE;
  hsmbus1.Init.PacketErrorCheckMode = SMBUS_PEC_ENABLE;
  hsmbus1.Init.PeripheralMode = SMBUS_PERIPHERAL_MODE_SMBUS_SLAVE;
  hsmbus1.Init.SMBusTimeout = 0x00008249;
  if (HAL_SMBUS_Init(&hsmbus1) != HAL_OK)
  {
    Error_Handler();
  }
  /** configuration Alert Mode
  */
  if (HAL_SMBUS_EnableAlert_IT(&hsmbus1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN I2C1_Init 2 */
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_ADDRI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_RXI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_TXI);
  __HAL_SMBUS_ENABLE_IT(&hsmbus1,SMBUS_IT_STOPI);
  /* USER CODE END I2C1_Init 2 */
}
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx)
{
  /* Check the parameters */
  assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  /* Return the data in the DR register */
  return (uint8_t)I2Cx->RXDR;
}

中断接收

/******************************************************************************/
/* STM32F0xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f0xx.s).                    */
/******************************************************************************/

/**
  * @brief This function handles I2C1 global interrupt.
  */
void I2C1_IRQHandler(void)
{
  /* USER CODE BEGIN I2C1_IRQn 0 */  
    if(__HAL_SMBUS_GET_FLAG(&hsmbus1,SMBUS_IT_ADDRI)!= RESET)
    {
        TX1_Buffer[Tx1_Cnt++] = I2C_ReceiveData(I2C1);
        __HAL_SMBUS_CLEAR_FLAG(&hsmbus1,SMBUS_IT_ADDRI);
    }
    else
    if(__HAL_SMBUS_GET_FLAG(&hsmbus1,SMBUS_IT_RXI)!= RESET)
    {
        TX1_Buffer[Tx1_Cnt++] = I2C_ReceiveData(I2C1);
        __HAL_SMBUS_CLEAR_FLAG(&hsmbus1,SMBUS_IT_RXI);
    }
    else
    if(__HAL_SMBUS_GET_FLAG(&hsmbus1,SMBUS_IT_NACKI)!= RESET)
    {
        TX1_Buffer[Tx1_Cnt++] = I2C_ReceiveData(I2C1);
        __HAL_SMBUS_CLEAR_FLAG(&hsmbus1,SMBUS_IT_NACKI);
    }
    else
    if(__HAL_SMBUS_GET_FLAG(&hsmbus1,SMBUS_IT_TCI)!= RESET)
    {
        TX1_Buffer[Tx1_Cnt++] = I2C_ReceiveData(I2C1);
        __HAL_SMBUS_CLEAR_FLAG(&hsmbus1,SMBUS_IT_TCI);
    }
    else
    if(__HAL_SMBUS_GET_FLAG(&hsmbus1,SMBUS_IT_ERRI)!= RESET)
    {
        TX1_Buffer[Tx1_Cnt++] = I2C_ReceiveData(I2C1);
        __HAL_SMBUS_CLEAR_FLAG(&hsmbus1,SMBUS_IT_ERRI);
    }
    else
    if(__HAL_SMBUS_GET_FLAG(&hsmbus1,SMBUS_IT_STOPI)!= RESET)
    {
        Tx1_Flag  = Tx1_Cnt;
        Tx1_Cnt   = 0;
        __HAL_SMBUS_CLEAR_FLAG(&hsmbus1,SMBUS_IT_STOPI);
    }
  /* USER CODE END I2C1_IRQn 0 */
  if (hsmbus1.Instance->ISR & (SMBUS_FLAG_BERR | SMBUS_FLAG_ARLO | SMBUS_FLAG_OVR | SMBUS_FLAG_TIMEOUT | SMBUS_FLAG_ALERT | SMBUS_FLAG_PECERR)) {
    HAL_SMBUS_ER_IRQHandler(&hsmbus1);
  } else {
    HAL_SMBUS_EV_IRQHandler(&hsmbus1);
  }
  /* USER CODE BEGIN I2C1_IRQn 1 */
  /* USER CODE END I2C1_IRQn 1 */
}uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx)
{
  /* Check the parameters */
  assert_param(IS_I2C_ALL_PERIPH(I2Cx));
  /* Return the data in the DR register */
  return (uint8_t)I2Cx->RXDR;
}

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版