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;