时序图
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函数实现的,还是需要使用硬件定时器去处理。