用SPI协议与外设进行通信(W25Q128)
SPI明明是MISO,主机作为输入,为什么配置的时候配置的是输出模式?
从参考手册中可以看到,当我们配置为复用功能输出的时候是同时具有输入功能的,故只用配置成输出就行。
使用SPI协议与外设W25Q128进行通信:
1.初始化GPIO
2.配置SPI工作模式
3.接收以及发送数据(数据要先发送,再接收)
//4.获取FLASH ID
发送0X9F,由于SPI时序是发送完一个字节,再发送第二个字节的时候接收第一个字节的数据,所以这儿在接第一个数据的同时,再继续发三个DUMMY。才能收到返回的地址。
5.写使能(数据擦除也是一种写数据(写1)),所以在进行数据擦除之前首先要写使能。
6.擦除FLASH
7.读取数据
8.获取寄存器的状态
9.读取数据 最多写256个数据
main函数实现:
/** ****************************************************************************** #include "stm32f4xx.h" #include "./usart/bsp_debug_usart.h" #include "./flash/bsp_spi_flash.h" uint8_t readBuffer[4096] = {0X0}; uint8_t writeBuff[4096] = {0x0}; /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { uint32_t device_id = 0; uint32_t i = 0; /*初始化USART 配置模式为 115200 8-N-1,中断接收*/ Debug_USART_Config(); FLASH_SPI_Config(); /* 发送一个字符串 */ Usart_SendString( DEBUG_USART,"这是一个FLASH实验\n"); printf("这是一个FLASH实验\n"); device_id = Read_Device_ID(); printf("device_id = 0x%x\n", device_id); erace_secter(0X00); Read_buffer(readBuffer, 0X00, 4096); printf("***********************\n"); for(i = 0; i<= 4096 ;i++) printf("0x%x ", readBuffer[i]); for(i=0;i<256;i++) writeBuff[i] = i; Write_buffer(writeBuff,0x00,256); //读出写入后的数据 Read_buffer(readBuffer,0x00,256); printf("\r\n*************读出写入后的数据**********\r\n"); for(i=0;i<256;i++) printf("0x%x ",readBuffer[i]); while(1) { } } /*********************************************END OF FILE**********************/
tip:每个命令一定要对着手册输入正确。一步一步调试。
欢迎加入作者的小圈子
扫描下方左边二维码加入QQ交流群,扫描下方右边二维码关注个人微信公众号并,获取更多隐藏干货,QQ交流群:859800032 微信公众号:Crystal软件学堂
![](https://images.cnblogs.com/cnblogs_com/Liu-Jing/1918101/o_210117135834QQ20201227141844.png)
![](https://images.cnblogs.com/cnblogs_com/Liu-Jing/1781432/o_200606025518o_200415115115qrcode_for_gh_5c7d1da35871_258.jpg)
作者:Liu_Jing bilibili视频教程地址:https://space.bilibili.com/5782182 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在转载文章页面给出原文连接。 如果你觉得文章对你有所帮助,烦请点个推荐,你的支持是我更文的动力。 文中若有错误,请您务必指出,感谢给予我建议并让我提高的你。 |