代码中使用关键字“return”把接收到的这个数据作为SPI_FLASH_SendByte函数的返回值, 所以我们可以看到在下面定义的SPI接收数据函数SPI_FLASH_ReadByte,它只是简单地调用了SPI_FLASH_SendByte函数发送数据“Dummy_Byte”, 然后获取其返回值(因为不关注发送的数据,所以此时的输入参数“Dummy_Byte”可以为任意值)。 可以...
SPI_FLASH_SendByte发送单字节函数中包含了等待事件的超时处理,这部分原理跟I2C中的一样,在此不再赘述。 SPI_FLASH_SendByte函数实现了前面讲的“SPI通讯过程”: 本函数中不包含SPI起始和停止信号,只是收发的主要过程,所以在调用本函数前后要做好起始和停止信号的操作; 对SPITimeout变量赋值为宏SPIT_FLAG_TIMEOUT...
这段代码利用控制 CS 引脚电平的宏“SPI_FLASH_CS_LOW/HIGH”以及前面编写的单字节收发函数 SPI_FLASH_SendByte,很清晰地实现了“JEDEC ID”指令的时序:发送一个字节的指令编码“W25X_JedecDeviceID”,然后读取 3 个字节,获取 FLASH 芯片对该指令的响应,最后把读取到的这 3 个数据合并到一个变量 Temp 中,然后...
1)SPI_FLASH_CS_LOW(),拉低CS线,片选FLASH,以使能FLASH设备。 2)利用SPI_FLASH_SendByte()向Flash发送第一个命令字节编码W25X_DeviceID,该宏展开后为0xAB. 3)根据指令表,发送完这个指令后,后面紧跟着三个字节的dummy byte,我们把Dummy_Byte宏定义为0xFF,实际上改成其它编码都可以,无影响。 4)完整的命令在...
在编程中,会用到刚才的SPI_Send_Byte()函数,这个函数是单字节的数据收发,所以flash返回的三个字节数据需要调用三次的SPI_Send_Byte()函数来进行接收。 #define FLASH_SPI_CS_HIGH GPIO_SetBits(GPIOA, GPIO_Pin_4);// flash芯片的CS引脚电平拉高#define FLASH_SPI_CS_LOW GPIO_ResetBits(GPIOA, GPIO_Pin...
以SPI方式读写FLASH的基本流程如下: (1)设置SPI的工作模式。 (2)flash初始化。 (3)SPI写一个字节、写使能函数、写数据函数,读数据函数等编写。 (4)主函数编写。 一 设置SPI工作模式。 宏定义 #define SPI_FLASH_CS_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_4) ...
(1); } /* 读取数据寄存器,获取接收缓冲区数据 */ return SPI_I2S_ReceiveData(FLASH_SPIx); } /** * @brief 使用SPI读取一个字节的数据 * @param 无 * @retval 返回接收到的数据 */ u8 SPI_FLASH_ReadByte(void) { return (SPI_FLASH_SendByte(Dummy_Byte)); } SPI_FLASH_SendByte发送单字节...
SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。 SPI主从模式 SPI分为主、从两种模式,一个SPI通讯系统需要包含一个(且只能是一个)主设备,...
return(SpiFlashSendByte(SPI_DUMMY_BYTE)); } 3、理解flash的读写操作 首先,写数据之前必须要擦除,因为所有的flash只能从1变为0,擦除将flash全部置1,写的时候相应位置0。 读写操作这部分,flash芯片手册详细的说明了操作步骤,需要注意的是:flash MX25L64的状态寄存器。对flash操作之前,先读flash_SR,确保WIP=...
return(SpiFlashSendByte(SPI_DUMMY_BYTE)); } 3、理解flash的读写操作 首先,写数据之前必须要擦除,因为所有的flash只能从1变为0,擦除将flash全部置1,写的时候相应位置0。 读写操作这部分,flash芯片手册详细的说明了操作步骤,需要注意的是:flash MX25L64的状态寄存器。对flash操作之前,先读flash_SR,确保WIP=...