我如何在STM32L412上工作I2C外设

问题描述

我正在尝试通过STM32L412上的I2C外设工作一个4通道DAC,我已经阅读了参考手册,但有些困惑,我的I2C无法正常工作。到目前为止,它发出了第一个地址字节OK,似乎有一个ACK位,但是什么都没有-只是停止条件。我正在尝试输出8个字节-四个12bit值分成两个字节。

我已经使用STM32cube对其进行了设置,但是后来发现我已经手动编写了一些东西-以下是初始化过程。我在400KHz的快速模式下工作-我用300nS作为上升/下降时间,外设的时钟频率为16MHz

有人可以帮助我吗?我不知道我在做什么错

static void MX_I2C2_Init(void)
{
 hi2c2.Instance = I2C2;
 hi2c2.Init.Timing = 0x00610611;
 hi2c2.Init.OwnAddress1 = 192;
 hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
 hi2c2.Init.OwnAddress2 = 0;
 hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
 hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
 if (HAL_I2C_Init(&hi2c2) != HAL_OK)
{
   Error_Handler();
 }
 /** Configure Analogue filter 
 */
 if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2,I2C_ANALOGFILTER_ENABLE) != HAL_OK)
 {
   Error_Handler();
 }
 /** Configure Digital filter 
*/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2,0) != HAL_OK)
{
  Error_Handler();
}
}

我已经在循环之前将其包含在主设置中

 I2C2->TXDR = DACdata[0]; //pre-load output register
 I2C2 ->CR2 &= ~(1<<25); //AUTOLOAD = 0
 I2C2 ->CR2 |= 0b1100000<<1; //enter slave address
 I2C2 ->CR1 |= 1 << 6 | 1<<1; //enable finish interrupts
 I2C2 ->CR2 |= 0b1000 << 16; //bytes to send = 8
 I2C2 ->CR2 |= 1<<13; //start DAC

这是我的中断,但是程序永远不会到达这里

void I2C2_EV_IRQHandler(void)
{
   if (I2C2->ISR & 1<<1)
  {
    i2ccounter++;
    I2C2->TXDR = DACdata[i2ccounter];
  }

 if (I2C2->ISR & 1<<6)
      {
        i2ccounter = 0;
        I2C2->TXDR = DACdata[0];
        I2C2 ->CR2 |= 1<<13; //start counter
      }
 HAL_I2C_EV_IRQHandler(&hi2c2);
}

和主循环

int main(void)
{
 HAL_Init();

SystemClock_Config();

MX_GPIO_Init();
MX_I2C2_Init();
MX_ADC1_Init();
MX_TIM1_Init();
MX_TIM2_Init();

I2C2->TXDR = DACdata[0]; //pre-load output register
I2C2 ->CR2 &= ~(1<<25); //autoend off
I2C2 ->CR2 |= 0b1100000<<1; //enter slave address
I2C2 ->CR1 |= 1 << 6 | 1<<1; //enable finish interrupts
I2C2 ->CR2 |= 0b1000 << 16; //bytes to send = 8
I2C2 ->CR2 |= 1<<13; //start DAC

while (1)
{
}

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)