了解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 */
}