w25q128是nor flash吗(w25q128是什么flash)

w25q128是nor flash吗(w25q128是什么flash)根据开发板的原理图 我们得知 SPI 连接处理器芯片和 SD 卡插座 CN4 I C 连接处理器芯片和 E PROM 256B 芯片 M24C02MN6 U6 UART2 连接处理器芯片和 USB 转串口芯片 IC FT2232D U3 UART1 连接处理器芯片和串口转 RS232 芯片 ST3232ECTR U5

大家好,我是讯享网,很高兴认识大家。



根据开发板的原理图,我们得知,
SPI连接处理器芯片和SD卡插座(CN4)
I²C连接处理器芯片和E²PROM(256B)芯片M24C02MN6(U6)
UART2连接处理器芯片和USB转串口芯片IC_FT2232D(U3)
UART1连接处理器芯片和串口转RS232芯片ST3232ECTR(U5)
JTAG连接处理器芯片和USB转串口芯片IC_FT2232D(U3)(这是因为CN2既是USB调试接口,也是USB转串口)
Flash是处理器芯片内置的,没有专门的芯片。
一、I2C

物理层
1.I²C有俩根引脚,SCL(串行时钟线)和SDA(串行双向数据线),所以是半双工通信模式
2.每一个连接到I²C总线上的设备都有一个独立的地址(可以是7位或10位地址),主机(处理器)利用这个地址对不同设备进行访问。(rbt6开发板默认I²C总线只连接了E²PROM)
3.I²C支持一主多从式通信,所有设备共享总线。(从发送器模式、从接收器模式、主发送器模式、主接收器模式)
4.3种传输模式:标准模式(100kb/s)、快速模式(400kb/s)、高速模式(3.4mb/s)(CCR寄存器控制)

3种状态:高电平、低电平、高阻态
(1)当某个设备空闲时,处于高阻态,相当于把这个设备断开,此时其他设备进行通信时,不会受空闲设备干扰。
(2)当所有从设备处于空闲态,那么,所有从设备处于高阻态,SCL和SDA都会被上拉电阻拉到高电平。SCL不会再有脉冲变化。
(3)I²C总线规定,同一时间只能有一个设备占用总线。
(4)当某个设备要输出高电平,其他的设备一定是空闲,此时,相当于总线上只有主机和从设备,不论该设备是高阻态还是输出高电平,对于主机来说,都是高电平,因为如果这个设备也处于高阻态,上拉电阻会把整个总线电平拉高,使主机读取到高电平。
(5)I²C的从设备一般是使用高阻态来表示高电平
(6)那么,怎么区分总线是在输出高电平还是空闲?看SCL线,如果输出高电平,肯定是在SCL的一个边沿脉冲时读取到的,而如果是空闲,SCL也会被上拉电阻拉到高电平,自然不会有什么边沿脉冲,所以就不会读取到高电平了
(7)当某个设备输出低电平,其他的设备一定是空闲,此时,相当于总线上只有主机和从设备,总线的电平会被从设备接地的低电平拉低,变成低电平,主机读取到的就是低电平。
(8)如果没有高阻态,一旦一个从设备是低电平,另一个输出高电平,就可能导致短路。
(9)高阻态表示:总线处于空闲,可以和从设备进行通信。总线是低电平,表示总线正在被占用,不能和其他设备进行通信。

协议层:

M系列芯片架构_M系列芯片架构
讯享网

M系列芯片架构_stm32_02

M系列芯片架构_起始信号_03

M系列芯片架构_嵌入式_04

主模式时, I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。
从模式时, I2C接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。
数据和地址按8位/字节进行传输,高位在前。跟在起始条件后的1或2个字节是地址(7位模式为1个字节, 10位模式为2个字节)。地址只在主模式发送。
在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。

I2C有俩种实现发送:
硬件实现协议
软件模拟协议

I2C默认I2C1是PB6、PB7(开发板上就是这个);PB10、PB11是I2C2(开发板没有支持)

库函数:

我们在自己编写IIC的传输函数时,应该严格遵守IIC传输时的时序编写

M系列芯片架构_stm32_05

M系列芯片架构_嵌入式_06

接受一个E²PROM的数据,时序同样应该遵守。二、E²PROM

E²PROM的数据传输需要在IIC传输的从设备地址后面再加一个E²PROM的内部地址,然后再传输数据

M系列芯片架构_M系列芯片架构_07

M系列芯片架构_stm32_08

M系列芯片架构_嵌入式_09

读出字节时,又有所不同。分为俩个阶段。第一个阶段:发S信号,传EEPROM设备地址,检测EV6事件后,传第一个数据(EEPROM内部地址)。第二个阶段:发S信号,传EEPROM设备地址,然后检测EV6事件(EV6有俩个,这里应该是接收器模式的EV6),然后读出一个字节数据,检测EV7事件。然后手动发送一个NACK,最后发送P(结束信号)。下同。

M系列芯片架构_数据_10

步骤:
一·、初始化I2C(只需要简单的调用库函数)
1.初始化I2C的GPIO接口
2.配置I2C的结构体
3.初始化I2C
4.使能I2C
二、读写EEPROM(需要严格按照时序编写)
5.编写I2C写入E2PROM的函数(按字节)
6.编写I2C读取E2PROM的函数(随机读取)
7.使用read和write进行校验
8.编写I2C写入和读取E2PROM的函数(按页写入、顺序读取)

初始化I2C

向EEPROM写一个字节

向EEPROM写n个字节(页写入)
页写入必须页对齐
(我们查看AT24C02手册时,会知道,大小为2kb的EEPROM,每页是8B,所以,页写入每次最多8个字节)

从EEPROM读n字节

等待EEPROM内部时序完成
这是因为EEPROM是非易失性存储器,速度比CPU要慢的多。在执行完写入EEPROM函数后,EEPROM内部时序仍然没有彻底完成。直接读数据,有可能卡在设备地址的发送上,导致程序卡死。(为什么是卡在这,我也不清楚)所以要等内部时序完成。(也可以直接进行简单的延时函数)
SB标志位:起始条件是否发送。
ADDR标志位:地址是否被发送

向EEPROM写n个字节
(不需要页对齐,且能写入任意不大于256个字节的数据)

以上都是属于i2c.c的内容

uart.c
(为什么需要写串口函数?)
因为我们需要通过串口调试助手回显I2C传递数据的结果到电脑屏幕。

main.c

小讯
上一篇 2025-05-05 20:11
下一篇 2025-05-10 19:22

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/171904.html