如何解决我如何在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 举报,一经查实,本站将立刻删除。