JimOrange 发表于 2024-3-1 22:34:58

第十九集:先占楼。

JimOrange 发表于 2024-3-1 22:35:07

本帖最后由 JimOrange 于 2024-5-3 22:08 编辑

第二十集:串口通信, USART(同步通信)意味着它可以通过外部时钟信号进行同步传输,
UART(异步通信)仅支持异步通信方式,即无需外部时钟信号,仅通过波特率发生器生成时钟;


全双工:


波特率:每秒可以传输多少位数据。


用于改善传输距离的芯片:


串口一:






串口二:







JimOrange 发表于 2024-3-1 22:35:20

第二十一集:先占楼。

JimOrange 发表于 2024-3-1 22:35:35

第二十二集:先占楼。

JimOrange 发表于 2024-3-1 22:35:49

第二十三集:先占楼。

JimOrange 发表于 2024-3-1 22:36:04

第二十四集:先占楼。

JimOrange 发表于 2024-3-1 22:36:21

第二十五集:先占楼。

JimOrange 发表于 2024-3-1 22:36:49

第二十六集:先占楼。

JimOrange 发表于 2024-3-1 22:37:06

本帖最后由 JimOrange 于 2024-3-2 21:36 编辑

第二十七集:软件模拟SPI。SPI-串型外设接口(Serial Peripheral Interface), 高速、全双工,同步的通信总线。
只占用4根管脚线:SS/CS(片选,Slave Select/Chip Select, 通常低电平有效)、MISO(主输入从输出,Master input Slave output)、MOSI、SCK(串行时钟信号,Serial Clock).


时钟极性 (CKP/CPOL): CKP为0,表示时钟空闲时为低电平,反之高电平。
时钟相位 (CKE/CPHA): CPHA为0,表示时钟信号第一个跳变沿采样,如果CPHA为1,则第二个跳变沿采样。
MSB:高位开始读写; LSB:地位开始读写


/////////////////////////////////////////////////
void SPI_Init(){
    //CPOL模式0
    CS      = 1;      //不选中该器件
    MISO    = 1;
    WP      = 1;
    MOSI    = 1;
    SCLK    = 0;      //spi模式0,sclk初始化为0
}
void SPI_WriteByte(u8 dat)
{
    u8 i;
    for (i = 0; i != 8; i++)
    {
      if (dat & 0x80)
            MOSI = 1;
      else
            MOSI = 0;

      SCLK = 1;       //下降沿读取
      SCLK = 0;
      dat << 1;      
    }
}

u8 SPI_ReadByte()
{
    u8 i, data = 0;
    for (i = 0; i != 8; i++)
    {
      SCLK = 1;
      if (MISO)
            data |= 0x01;
      SCLK = 0;
      dat << 1;      
    }
    return data;
}
MSB:(Most Significant Bit)指的是最高有效位,LSB:(Least Significant Bit)指的是最低有效位。


Flash测试,我使用了外部Flash测试模块,芯片为W25Q32FV,用户手册Device ID:0x15. (15h)




      CS = 0;
      SPI_WriteByte(0xAB);

      SPI_WriteByte(0x00);
      SPI_WriteByte(0x00);
      SPI_WriteByte(0x00);

      ID = SPI_ReadByte();
      CS = 1;




JimOrange 发表于 2024-3-2 22:09:01

本帖最后由 JimOrange 于 2024-3-2 23:18 编辑

第二十八集:硬件模拟SPI。一共分成3组:独立SPI(支持DMA,direct memory access),两组USART的SPI(不支持DMA)。

因为只有一组独立SPI,所以需要主动选择使用哪一组端口。



SPIF:读到0为正在读/写,读到1表示完成。
WCOL:读到1为正在写数据。
读写操作都需要清空SPIF、WCOL。


SPDAT:SPI数据寄存器/缓冲器,只有8位数据保存。读/写都通过SPDAT。



SPCTL:SPI控制寄存器(重点)


SSIG:为0,则是互为主从模式,通过判断SS(Slave select)引脚确定哪个位主/从;         
         为1,则忽略SS引脚,使用MSTR位来判断主/从。
SPEN: 1使能SPI。


DORD:0为先接收/发送数据的高位(MSB);
            1为先接收/发送数据的低位(LSB)。
MSTR:主/从模式选择
             设置主机模式:MSTR必须为1
                           若SSIG为0,那么SS引脚需为高电平,因为通过高电平确定此芯片为主机;
                           若SSIG为1,则忽略SS引脚。


             设置从机模式:
                           若SSIG为0,那么SS引脚需为低电平,因为通过低电平确定此芯片为从机。与MSTR无关。
                           若SSIG为1,MSTR为0,忽略SS引脚。

CPOL:SPI时钟极性控制, 0为SCLK时钟空闲为低电平,1为高电平。

CPHA:SPI时钟相位控制,0为第一个时钟驱动完后采样,1为第二个时钟后采样。(不确定是否理解正确)


SPR: SPI时钟频率选择,                                             
               00:SPI时钟 / 4
                01:SPI时钟 / 8               
               10:SPI时钟 / 16
                11:SPI时钟 / 2

使能SPI一定要最后调用,因为过早打开会提前传输数据。

SPCTL = 1001 0000b;    //根据以上推断
SPEN = 1;







页: 1 2 3 4 [5] 6
查看完整版本: STC32G12k128K 学习开始,打卡中~实验箱收到了~ !