IIC
I2C 總線是一種串行數據總線,只有二根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL,兩條線可以掛多個設備。 IIC設備(絕大多數)裏有個固定的地址,只有在兩條線上傳輸的值等於IIC設備的固化地址時,其纔會作出響應。通常我們爲了方便把IIC設備分爲主設備和從設備,基本上誰控制時鐘線(即控制SCL的電平高低變換)誰就是主設備。
I2C_HandleTypeDef hi2c1;
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x2000090E;
hi2c1.Init.OwnAddress1 = 0; //用戶自己配置的地址
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
{
Error_Handler();
}
}
引腳配置
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(i2cHandle->Instance==I2C1)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF1_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* I2C1 clock enable */
__HAL_RCC_I2C1_CLK_ENABLE();
}
}
反初始化配置
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{
if(i2cHandle->Instance==I2C1)
{
/* Peripheral clock disable */
__HAL_RCC_I2C1_CLK_DISABLE();
/**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
}
}
/* 第1個參數爲I2C操作句柄
第2個參數爲從機設備地址
第3個參數爲從機寄存器地址
第4個參數爲從機寄存器地址長度
第5個參數爲發送的數據的起始地址
第6個參數爲傳輸數據的大小
第7個參數爲操作超時時間 */
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c,
uint16_t DevAddress,
uint16_t MemAddress,
uint16_t MemAddSize,
uint8_t *pData,
uint16_t Size,
uint32_t Timeout)
從機設備地址:
#define PCF8574T_ADDRESS 0x40
IIC通信時序圖
初始化:IIC的初始化爲SDA和SCL均爲高。
開始信號:處理器讓SCL時鐘保持高電平,然後讓SDA數據信號由高變低就表示一個開始信號。同時IIC總線上的設備檢測到這個開始信號它就知道處理器要發送數據了。
停止信號:處理器讓SCL時鐘保持高電平,然後讓SDA數據信號由低變高就表示一個停止信號。同時IIC總線上的設備檢測到這個停止信號它就知道處理器已經結束了數據傳輸,我們就可以各忙各個的了,如休眠等。
pcf8574T
上圖是PCF8574T的地址。注意: S代表啓動信號,A代表應答信號。
A旁邊的0表示讀或寫(R/W),當(R/W)爲1的時候表示讀,當(R/W)爲0的時候表示寫。
現把地址控制線,即A2、A1、A0全部接地,這樣就可以計算出來PCF8574T的八位二進制數01000001,可以得到讀控制指令爲0x41,寫控制指令八位二進制數01000000爲0x40。
參考
https://blog.csdn.net/lingdongtianxia/article/details/81135456
https://www.cnblogs.com/smbx-ztbz/p/5040984.html
https://wenku.baidu.com/view/0f91f9dcad51f01dc281f1f8.html
https://www.cnblogs.com/xingboy/p/9647326.html