title: DAY10
categories: STM32
abbrlink: cb1014ed
date: 2022-07-28 23:46:38
4.W25Q128芯片
(1)引脚信息和寄存器描述
CS WP HOLD都是低电平有效,WP和HOLD直接接高电平,功能关闭,片选信号低电平有效
支持SPI的CPOL,CPHA分别为0,0和1,1的情形
(2)操作时序
注意:在进行任何操作之前必须打开片选,操作完成后关闭片选,打开和关闭之间要有时间间隔。
1)读设备ID
发送90H ===> 发送24位0地址 ===> 发回厂家ID和设备ID(0xef 0x17)
练习:
修改spi的模式和速度,测试w25q128支持哪些方式。
2)读数据
发送03H ===> 发送读的24位地址 ===> 发回要读的数据
3)开启/关闭写使能
开启:发送06H
关闭:发送04H
4)读状态寄存器1
发送05H ===> 发回状态寄存器1的值
5)扇区擦除
开启写使能 ===> 延时 ===> 发送20H ===> 发送24位的擦除地址
===>等待擦除完成(查询状态寄存器1的BUSY位) ===> 关闭写使能
6)写数据
开启写使能 ===> 延时 ===> 发送02H ===> 发送24位的写地址 ===>发送写的数据
===>等待写完成(查询状态寄存器1的BUSY位) ===> 关闭写使能
练习:
通过蓝牙读取温湿度,当温度>27,将温度和采集时间写入到w25q128,并且可以蓝牙命令读出来。
(3)flash存储算法
flash写之前必须先擦除,但是擦除一次是一大块空,写可能只是写一小段,如果写一次擦一次,既浪费空间又影响寿命。为了更大效率使用flash存储空间,我们一般这么做
1.将整个扇区(擦除单位)分为很多个小块,比如说(16byte一块)
2.每个小块的第一个字节存固定的值(0xa5)表示该块正在使用,之后14个存具体数据
最后一个字节存校验和
0xa5+data1+data2+...+data14+checksum
checksum = 0xa5+data1+data2+...+data14
3.使用flash写数据时先通过读找到未使用的位置,再开始写
二十七.RFID读卡器
1.RFID的操作
初始化
(1)请求卡 ----------- 寻找附近有信号的卡
u8 MFRC522_Request(u8 reqMode, u8 *TagType);
(2)防碰撞 ----------- 选择一张信号最强的卡(得到卡ID)
u8 MFRC522_Anticoll(u8 *serNum) ;
(3)选卡 --------- 选择一张要通信的卡
u8 MFRC522_SelectTag(u8 *serNum);
(4)密钥验证 --------- 验证身份
u8 MFRC522_Auth(u8 authMode, u8 BlockAddr, u8 *Sectorkey, u8 *serNum);
(5)读写卡片 --------- 数据读写
u8 MFRC522_Read(u8 blockAddr, u8 *recvData);
u8 MFRC522_Write(u8 blockAddr, u8 *writeData);
2.和开发板的连接
练习:
读卡成功蜂鸣器短鸣一声,非法卡蜂鸣器长鸣一声
二十八.RS485
1.概念
RS485最先发明应用于仪器仪表的通信,用于替代RS232。由于RS232只能点对点通信,不能组网,而且是模分信号,抗干扰性和传输距离都收到限制。RS485解决了上述问题,其既可以组网,也可以通过差分信号增强抗干扰性和扩展了传输距离。
RS485属于主从通信,一般也是一个主机带多个从机
2.硬件连接
根据RS485标准,差分电压大于+200mV就表示1,差分电压小于-200mV表示0
3.M4开发板上的RS485
开发板上RS485接口通过芯片转换后连接到了USART2
4.485调试器
5.通信的参考代码
//模式控制
#define RS485_TX_EN PGout(8) //0-接收 1-发送
//发送
void rs485_send_data(u8 *pdata,u32 len)
{
u32 i;
RS485_TX_EN = 1;
delay_ms(1);
for(i=0;i<len;i++){
USART_SendData(USART2,pdata[i]);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)!=SET);
}
delay_ms(1);
RS485_TX_EN = 0;
}
//接收
void USART2_IRQHandler(void)
{
u8 data;
//是不是接收中断
if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET){
//接收数据
data = USART_ReceiveData(USART2);
//原路发回
usart1_putc(data);
//清除中断标志
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
}
二十九.CAN总线
1.概念
CAN指的是控制器局域网网络(Controller Area Network),由德国的汽车电子厂商博世公司开发。
CAN是差分信号,具有较强的抗干扰能力和传输稳定性
CAN属于多主通信,网络中所有的设备都可以作为主设备发起通信
CAN的网络扩展非常简单,在CAN网络中扩展新的单元,网络中的旧单元的软硬件无需做任何修改。
CAN具有较强的纠错能力,容易发现传输中的错误。
2.CAN的差分信号
模分信号采用单根数据线的电平表示逻辑的差别,差分信号采用两个数据线,使用两个先的电压差值俩表示逻辑值。CAN传输使用两根数据线 --------- CANH和CANL
高速ISO11898标准:
如果CANH(3.5V)和CANL(1.5V)的电压差 = 2V,此时表示逻辑0,叫做显性电平
如果CANH(2.5V)和CANL(2.5V)的电压差 = 0V,此时表示逻辑1,叫做隐性电平
//如果多个控制单元同时控制总线电平,最终显示的是显性电平(0)
3.CAN通信协议
CAN通过五种通信帧实现通信,以数据帧来介绍帧结构
数据帧分析
数据帧分为标准数据帧和扩展数据帧
D - 显示电平 R - 隐性电平
数据帧由7部分组成
(1)帧起始
一位显性电平(0)
(2)仲裁段
既可以用来表示帧的优先级,也用来实现帧的过滤
1.标准帧
标准帧的仲裁段由11位ID和1位RTR位组成,RTR用来区分数据帧(显性电平)和遥控帧
2.扩展帧
扩展帧的仲裁段由29位ID,1位RTR,1位SRR和1位IDE组成,RTR用来区分数据帧(显性电平)和遥控帧
SRR用于代替标准帧中的RTR位,由于SRR是隐性电平,RTR是显性电平,相同ID的标准帧优先级高于扩展帧
IDE用于区分标准帧(RTR下一位)和扩展帧,显示电平表示标准帧,隐性电平表示扩展帧
报文的优先级由ID仲裁来决定,通过总线上同时出现显性电平和隐性电平时,最终结果为显性电平的特性来实现仲裁
当多个节点同时竞争总线占有权时,谁先出现隐性电平,将失去总线占有权,转为接收状态。
作业:
实现按S1,进入刷卡登记模式,登记合法的卡
按S2,进入刷卡验证模式,验证是否是合法卡