時序圖 時序圖 1. 參考資料 2. 基礎 3. 符號 3.1. 斜線形式的上升沿、下降沿 3.2. Either or 信號 3.3. 波形省略 3.2.1. 虛線 3.2.2. 波浪號 3.4. 地址&數據表示 4. 實例-WT588F語音晶元時序圖 4.1. 瞭解背景 4.2. 分析 4.3. ...
時序圖
1. 參考資料
2. 基礎
- 時序圖:用於表示單片機硬體的底層通信原理
- 多波形時序圖:同一時間內,多個埠組合出的電平關係變化
- 橫軸:表示時間
- 縱軸:表示邏輯信號0或者邏輯信號1
3. 符號
3.1. 斜線形式的上升沿、下降沿
上升沿、下降沿除了直線以外,也有斜線(因為在物理上不可能出現狀態的秒變化)。
3.2. Either or 信號
表示信號在這一時間既可以高電平,也可以是低電平,常見於數據線。
3.3. 波形省略
波形省略在圖中有兩種常見的表現形式:
3.2.1. 虛線
3.2.2. 波浪號
3.4. 地址&數據表示
時序圖上常用A來表示Address, D來表示Data
4. 實例-WT588F語音晶元時序圖
4.1. 瞭解背景
MCU向語音晶元發送控制指令,語音晶元按照指令運行
4.2. 分析
分析這張時序圖:
- 預設電平狀態:CLK和DATA都是預設高電平
- 開始信號及結束信號:開始信號CLK拉低5ms;結束信號CLK和DATA恢復高電平
- 操作時序:上升沿接收數據,根據圖像,需要先將CLK拉低、配置DATA數據,延時一個周期,再將CLK拉高延時一個周期。
- 數據順序:接收數據低位在先
4.3. 列邏輯
列出詳細邏輯:
- 初始化高電平
- CLK拉低延時5ms
- 獲取data最低位數據(儘可能放在數據發送之外)
- 迴圈8次,MCU發送8位數據
- CLK拉低(第1次迴圈的時候沒有明顯作用,但是後續需要)
- DATA設置為指令對應邏輯電平
- CLK延時一個周期
- CLK拉高
- CLK延時一個周期
- 更新待發送的數據(儘可能放在數據發送之外)
- 迴圈執行完成之後將DATA和CLK拉高
4.4. 根據邏輯寫代碼(偽代碼)
#define CLK P1 // 引腳定義
#define DATA P2
void operation(data) // data是發送的指令數據
{
CLK = 1; // 初始化高電平
DATA = 1;
CLK = 0; // CLK拉低延時5ms
delay_ms(5);
b_data = data & 0x01; // 獲取data最低位數據
for(int i=0; i<8; i++) // 迴圈8次,MCU發送8位數據
{
CLK = 0; // 第1次迴圈的時候沒有明顯作用,但是後續需要
DATA = b_data; // DATA設置為指令對應邏輯電平
delay_us(300); // CLK延時一個周期
CLK = 1; // CLK拉高
delay_us(300); // CLK延時一個周期
data = data >> 1;
b_data = data & 0x01; // 更新待發送的數據
}
CLK = 1; // 迴圈執行完成之後將DATA和CLK拉高
DATA = 1;
}
5. 總結
- 請依據時序圖寫出偽代碼
others
我記得最一開始接觸時序圖的時候,覺得它好難,不想看。但是這次複習這部分知識的時候,又覺得好簡單,視頻兩倍速我都覺得速度有點慢。複習的時候這種時刻最爽了,感覺現在的自己比之前厲害好多。
從我的經驗來說,根據時序圖進行編碼的時候需要註意兩個問題:
- 一是在通訊的代碼中不要隨便列印內容進行debug。這個說起來很蠢,但是我就是這樣乾的,為了檢查代碼運行是否正常,在通訊程式中添加了串口列印,本身程式執行就是需要時間的,這種處理很有可能影響正常通訊。
- 二是如果項目是在RTOS基礎上構建的情況下,需要註意最小的延時範圍。比如我之前的實踐當中,配置FreeRTOS的tick是1ms,我如果想要實現300us的延時,是沒有辦法直接通過系統的delay函數實現的,還是需要使用硬體定時器去處理。