因为使用TMP112温度芯片,该芯片是I2C接口,用来测试温度,需要和主板进行通信。需要对STM32F407进行代码编写。
主机初始I2C接口初始代码如下:
LL_I2C_InitTypeDef I2C_InitStruct = {0};
LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
/**I2C2 GPIO Configuration
PB10 ------> I2C2_SCL
PB11 ------> I2C2_SDA
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_10|LL_GPIO_PIN_11;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH;
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_DisableOwnAddress2(I2C2);
LL_I2C_DisableGeneralCall(I2C2);
LL_I2C_EnableClockStretching(I2C2);
I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C;
I2C_InitStruct.ClockSpeed = 100000;
I2C_InitStruct.DutyCycle = LL_I2C_DUTYCYCLE_2;
I2C_InitStruct.OwnAddress1 = 0;
I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK;
I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT;
LL_I2C_Init(I2C2, &I2C_InitStruct);
LL_I2C_SetOwnAddress2(I2C2, 0);
然后再循环中使用下面函数就可以读取数据了。自己记录下来:
I2C_DELAY_BLOCK(!LL_I2C_IsActiveFlag_BUSY(I2C_x));
/* 2.发送START信号 */
LL_I2C_AcknowledgeNextData(I2C_x, LL_I2C_ACK);
LL_I2C_GenerateStartCondition(I2C_x);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_SB(I2C_x));
/* 3.写器件地址 */
LL_I2C_TransmitData8(I2C_x, SlaveAddr);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_ADDR(I2C_x));
LL_I2C_ClearFlag_ADDR(I2C_x); // 清除标志位
/* 4.地址位已经置位,通常TXE也会完成,为了谨慎,再查一下. */
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_TXE(I2C_x));
/* 5.发送器件寄存器地址. */
LL_I2C_TransmitData8(I2C_x, ReadAddr);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_TXE(I2C_x));
/* 6.提供RESTART信号. */
LL_I2C_GenerateStopCondition(I2C_x);
LL_I2C_GenerateStartCondition(I2C_x);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_SB(I2C_x));
//LL_I2C_HandleTransfer
/* 7.重新发送地址,并附带读标记. */
LL_I2C_TransmitData8(I2C_x, SlaveAddr | 0x01);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_ADDR(I2C_x));
/* 8.标记读完就STOP. */
LL_I2C_AcknowledgeNextData(I2C_x, LL_I2C_ACK);
LL_I2C_ClearFlag_ADDR(I2C_x);
// LL_I2C_GenerateStopCondition(I2C_x);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_RXNE(I2C_x));
pRecevData[0]= LL_I2C_ReceiveData8(I2C_x);
/* 8.标记读完就STOP. */
LL_I2C_AcknowledgeNextData(I2C_x, LL_I2C_NACK);
LL_I2C_ClearFlag_ADDR(I2C_x);
LL_I2C_GenerateStopCondition(I2C_x);
I2C_DELAY_BLOCK(LL_I2C_IsActiveFlag_RXNE(I2C_x));
/* 9.数据已读取. */
pRecevData[1]= LL_I2C_ReceiveData8(I2C_x);
经过测试,完全没有问题,使用示波器,也查看了波形,波形非常正常。代码供自己以后使用。