Embedded 如何在STM32L412上使用I2C外围设备

Embedded 如何在STM32L412上使用I2C外围设备,embedded,stm32,i2c,Embedded,Stm32,I2c,我试图让4通道DAC通过STM32L412上的I2C外围设备工作,我已经阅读了参考手册,但我有点困惑,我的I2C不工作。到目前为止,它发送第一个地址字节OK,看起来好像有一个ACK位,但是什么都没有——只是一个停止条件。我试图输出8个字节-四个12位的值,每个值分为两个字节 我已经使用STM32cube设置了它,但我发现我后来不得不手动编写一些东西-下面是初始化。我在快速模式下工作,400KHz-我使用300nS作为上升/下降时间,外围设备的时钟频率为16MHz 有人能帮我吗?我不知道我做错了什

我试图让4通道DAC通过STM32L412上的I2C外围设备工作,我已经阅读了参考手册,但我有点困惑,我的I2C不工作。到目前为止,它发送第一个地址字节OK,看起来好像有一个ACK位,但是什么都没有——只是一个停止条件。我试图输出8个字节-四个12位的值,每个值分为两个字节

我已经使用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
I2C2->TXDR=DACdata[0]//预加载输出寄存器

I2C2->CR2&=~(1使用幻数是陷入麻烦的最佳方式。我不知道这意味着什么。B1000使用STM标题中的humar可读定义。谁会检查特定寄存器中第16位的内容。避免将其视为一个格子,无论是对于以后需要维护代码的人还是StackOverflow上的人,它都非常难读。你不太可能得到答案。。。
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)
{
}

}