时序图

时序图

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. 分析

分析这张时序图:

  1. 默认电平状态:CLK和DATA都是默认高电平
  2. 开始信号及结束信号:开始信号CLK拉低5ms;结束信号CLK和DATA恢复高电平
  3. 操作时序:上升沿接收数据,根据图像,需要先将CLK拉低、配置DATA数据,延时一个周期,再将CLK拉高延时一个周期。
  4. 数据顺序:接收数据低位在先

4.3. 列逻辑

列出详细逻辑:

  1. 初始化高电平
  2. CLK拉低延时5ms
  3. 获取data最低位数据(尽可能放在数据发送之外)
  4. 循环8次,MCU发送8位数据
  5. CLK拉低(第1次循环的时候没有明显作用,但是后续需要)
  6. DATA设置为指令对应逻辑电平
  7. CLK延时一个周期
  8. CLK拉高
  9. CLK延时一个周期
  10. 更新待发送的数据(尽可能放在数据发送之外)
  11. 循环执行完成之后将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. 总结

  1. 请依据时序图写出伪代码

others

我记得最一开始接触时序图的时候,觉得它好难,不想看。但是这次复习这部分知识的时候,又觉得好简单,视频两倍速我都觉得速度有点慢。复习的时候这种时刻最爽了,感觉现在的自己比之前厉害好多。

从我的经验来说,根据时序图进行编码的时候需要注意两个问题:

  • 一是在通讯的代码中不要随便打印内容进行debug。这个说起来很蠢,但是我就是这样干的,为了检查代码运行是否正常,在通讯程序中添加了串口打印,本身程序执行就是需要时间的,这种处理很有可能影响正常通讯。
  • 二是如果项目是在RTOS基础上构建的情况下,需要注意最小的延时范围。比如我之前的实践当中,配置FreeRTOS的tick是1ms,我如果想要实现300us的延时,是没有办法直接通过系统的delay函数实现的,还是需要使用硬件定时器去处理。
posted @ 2024-05-10 19:21  霍北北  阅读(27)  评论(0编辑  收藏  举报