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;
JimOrange
发表于 2024-3-21 18:15:25
本帖最后由 JimOrange 于 2024-3-21 18:41 编辑
第二十九集:SPI读取FLash芯片。W25X40CL简介。(我用的是W25Q32FV, 一个Page有256个字节,一个Sector有16个Page,一个Block有16个Sector,而这个Flash有0x3F个Block,也就是64个)。
写入使能 06h、读取状态寄存器 05h、写入数据(一个page)02h、读取数据03h、Sector擦除 20h
JimOrange
发表于 2024-3-21 20:04:14
本帖最后由 JimOrange 于 2024-3-21 23:47 编辑
第三十集:软件模拟IIC.
IIC是一种双向二线的串口通信。一个时钟线(SCK),一个数据线(SDA)。通过地址区分从设备。
1. 主机在空闲的时候(即SCK和SDA都是高电平),需要新发送一个start信号(SCK为高,SDA由1变为0);
2. 发送7个位的地址,和一位的读/写信号(0为写,1为读)。总共8位,一个字节的。
3. 会收到应答信号(ACK = 0);
4. 发送一个数据都会等待一个应答;重复。。。
5.当发送完成,就发送End信号(SCK为高,SDA由0变为1)。
数据的传输:
SCL为低电平,才允许SDA变化。 如果SDA变化好了,等SCL为高电平(1),此时SDA电平要保持,直到SCL为低电平(0)。
起始信号:
发出ACK信号:
ACK(SDA = 0)、NO_ACK(SDA = 1)
等待从机应答:
先拉高SDA,然后再读取SDA,如果SDA等于0,表示正确,否则为错误。
停止信号:
地址:A2、A1、A0默认都接地,所以都为0. AT24C02默认地址格式:0x 1 0 1 0 A1 A2 A3 R/W(0为写入,1位读取)
读取地址:0xA1, 写入地址:0xA0