何為總線?
連接多個部件的信息傳輸線,是部件共享的傳輸介質
總線的作用?
實現數據傳輸,即模塊之間的通信
總線如何分類?
根據總線連接的外設屬于內部外設還是外部外設將總線可以分為片內總線和片外總線
可分為數據按位順序傳輸占用引腳較少但是速度相對較慢的串行通信 和? 數據各個位同時傳輸,速度較快但是占用引腳資源多的并行傳輸
又根據收發數據根據對時鐘信號的依賴關系區分為同步通信 和 異步通信
根據數據的傳輸方向性,又將通信可區分為 單工,半雙工 和雙 工,
其中UART是串行全雙工異步通信、IIC是串行半雙工同步通信、spi是串行全雙工同步通信。
UART(Universal asynchronous receiver/transmitter\通用異步接收發送器)
串口用于兩個模塊之間進行異步全雙工串行通信
將TXD和RXD交叉連接,然后將接地線接地(TXD數據發送線,RXD數據接收線)
TTL電平3.3\5邏輯1,接地邏輯0
特點:易被干擾源干擾,抗干擾能力弱,一般只適用于同一塊板子上面的兩個芯片之間盡心數據收發
關于串口的配置:
1.設置8bit數據位
2.設置無校驗位
3.設置1bit停止位
4.設置波特率為115200
5.設置16倍過采樣
6.使能發送器 TE
7.使能接收器 RE
8.使能串口 UE
9.發送數據:
判斷發送數據寄存器是否為空 TXE==1
為空則向發送數據寄存器寫入,不為空則等待
等待發送完成TC==1,此時發送結束
10.接收數據 :
判斷接收數據寄存器不為空 RXNE==1
不為空可以讀取
使用流程:
1.使能UART外設時鐘和對應的GPIO口的時鐘
2.功能復用,將對應的GPIO口復用為串口功能
3.禁用串口
4.設置數據幀格式(8N1)
5.設置分頻、采樣、波特率(注:采樣常用的是16倍過采樣)
6.使能發送器
7.使能接收器
8.使能串口(與第三步交相呼應)
UART相關的 HAL庫函數
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
注:
兩個函數均會阻塞
串口進行數據打印需要將printf函數重映射(重寫fputc)
IIC(i2c)
最大支持多主機多從機通信
SDA&SCL,多從機并聯入雙線,雙線空閑保持高電平,需要接上拉電阻
信號分類:起始信號、終止信號、應答信號、非應答信號、數據接收和發送信號
注:起始信號終止信號均由主機發起
IIC數據格式
具體格式都是由各個傳感器各自的協議去制定格式,但是大致流程基本相同
起始信號 -7位從機地址為加寫標志位-(應答/非應答)-8位從機寄存器地址-8位數據-(應答\非應答)- 結束信號
或
起始信號 -7位從機地址為加寫標志位-(應答/非應答)-8位從機寄存器地址-起始信號-7位從機地址加讀標志位-(應答/非應答)-數據-(應答\非應答)- 結束信號
通信速率為100k、400k、1M和3.4M
使用流程:
1.使能對應的端口時鐘
2.設置管腳(輸出模式,輸出速度,上拉下拉電阻)
3.SDA&SCL雙線拉高空閑
4.信號函數的封裝(一般直接down,會封裝就更nice了)
5.信號函數的調用
注:重難點在對對應傳感器手冊的查詢
IIC相關的HAL庫函數
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
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)
SPI(Serial Peripheral interface)串行外圍設備接口
最大支持一主機多從機
是一種高速的,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,節約了芯片的管腳,同時為PCB的布局上節省空間,提供方便,正是出于這種簡單易用的特性,現在越來越多的芯片集成了這種通信協議。
不再采用具體的數據格式,而是采用具體的通信規則
通過約定好的通信時鐘極性和時鐘相性去使數據線進行對應的數據的采集和數據的輸出
使用流程
更加依賴被控制的芯片的手冊,比如控制數碼燈的各類三八譯碼器或者是控制OLED屏時相關OLED屏的數據手冊
SPI相關的HAL庫函數
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)