IIC通信协议(二)使用STM32CUBEMX配置STM32U5的IIC

了解STM32CUBEMX配置STM32U575RG芯片的内容

配置

Timing Configuration   时间配置

        1)I2C Speed Mode                IIC的通信速度

                1.  Standard Mode        标准模式        100kHz

                2.  Fast Mode                 快速模式        400kHz

                3.  Fast Mode Plus        高速模式        1MHz

        2)I2C Speed Frequency(KHz)     IIC通信频率

        3)Rise Time (ns)                IIC的CLK时钟线的上升时间

                有计算方法,可以自己搜一下

        4)Fall Time (ns)             CLK的下降时间

        5)Coefficient of Digital Filter         数字滤波器系数  

                       过滤掉信号中的噪声,有助于提高稳定性和可靠性

                        一般选最大就可以

        6)Analog Filter                 模拟滤波器

                主要作用是滤除 SDA 和 SCL 输入端的高频噪声,特别是那些宽度小于 50 ns 的尖峰信号。这对于提高 I2C 通信的可靠性和稳定性非常重要,尤其是在嘈杂的电磁环境中

        7)Timing                        自动生成 不用管

Slave Features        从机特性

        1)Clock No Stretch Mode       时钟无拉伸模式

                时钟拉伸是一种机制,允许从设备在需要时将SCL拉低,以暂停数据传输,直到从设备准备好在释放SCL,让传输继续进行。

        2)General Call Address Detection        通用呼叫地址检测

                通用呼叫地址(General Call Address)是一个特殊的地址,通常为 0x00,用于向所有连接到 I2C 总线上的设备发送广播消息。当启用通用呼叫地址检测时,从设备会响应这个地址,从而允许主设备向所有从设备发送数据

        3)primary Address Ledgth selection                设备地址长度选择

                7 bit 和 10 bit  ,一般选择7位

        4)Dual Address Acknowledged        双地址确认

                允许 I2C 从设备拥有两个地址。当启用双地址确认时,从设备可以响应两个不同的地址,比如LCD的控制寄存器地址 和数据寄存器地址。

        5)Primary slave address                设置从地址(0~127)

                注意:这个会在程序中左移一位

        例如:在STM32CUBEM填写的从机地址是 00000001,(0x01),在程序中是 00000010 (0x02)

Autonomous Mode        自治模式

       1)   Autnomous Mode        自主模式

                允许 I2C 从设备在没有主设备CPU干预的情况下自动处理数据传输

        2)Trigger State                 触发状态

                用于配置 I2C 通信中的触发条件。这可以用于在特定条件下启动或停止数据传输

        3)Trigger Selection         触发选择

                用于选择触发条件的具体类型。这可以是基于地址、数据内容或其他特定条件的触发

        4)Trigger Polarity       触发极性

                用于设置触发信号的极性。这可以是上升沿或下降沿触发 

示例

        主机:

        

void MX_I2C1_Init(void)
{

  LL_I2C_InitTypeDef I2C_InitStruct = {0};
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1);

  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
  /**I2C1 GPIO Configuration
  PB6   ------> I2C1_SCL
  PB7   ------> I2C1_SDA
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1);


  /* USER CODE BEGIN I2C1_Init 1 */

  /* USER CODE END I2C1_Init 1 */

  /** I2C Initialization
  */
  LL_I2C_EnableAutoEndMode(I2C1);
  LL_I2C_DisableOwnAddress2(I2C1);
  LL_I2C_DisableGeneralCall(I2C1);
  LL_I2C_EnableClockStretching(I2C1);
  I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;
  I2C_InitStruct.Timing = 0x10802388;
  I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE;
  I2C_InitStruct.DigitalFilter = 15;
  I2C_InitStruct.OwnAddress1 = 0;
  I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;
  I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
  LL_I2C_Init(I2C1, &I2C_InitStruct);
  LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK);
  /* USER CODE BEGIN I2C1_Init 2 */

  /* USER CODE END I2C1_Init 2 */

}
        从机:

void MX_I2C2_Init(void)
{

  /* USER CODE BEGIN I2C2_Init 0 */

  /* USER CODE END I2C2_Init 0 */

  LL_I2C_InitTypeDef I2C_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  LL_RCC_SetI2CClockSource(LL_RCC_I2C2_CLKSOURCE_PCLK1);

  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
  /**I2C2 GPIO Configuration
  PB13   ------> I2C2_SCL
  PB14   ------> I2C2_SDA
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_13|LL_GPIO_PIN_14;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_4;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* Peripheral clock enable */
  LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C2);


  /* USER CODE BEGIN I2C2_Init 1 */

  /* USER CODE END I2C2_Init 1 */

  /** I2C Initialization
  */
  LL_I2C_EnableAutoEndMode(I2C2);    // 启用自动停止条件
  LL_I2C_DisableOwnAddress2(I2C2);    // 禁用双地址确认
  LL_I2C_DisableGeneralCall(I2C2);    // 禁用 通用呼叫
  LL_I2C_EnableClockStretching(I2C2);    // 启用时钟拉伸
  
  I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;  // IIC模式
  I2C_InitStruct.Timing = 0x10802388;
  I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; 
  I2C_InitStruct.DigitalFilter = 15;   
  I2C_InitStruct.OwnAddress1 = 6;        //从机地址 在STM32CUBEMX中写的是 3 左移了一位 变为6
  I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;    // 发送和接收数据后 自动回复ACK
  I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
  LL_I2C_Init(I2C2, &I2C_InitStruct);
  LL_I2C_SetOwnAddress2(I2C2, 0, LL_I2C_OWNADDRESS2_NOMASK);
  /* USER CODE BEGIN I2C2_Init 2 */

  /* USER CODE END I2C2_Init 2 */

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值