最近在搞SPI Flash的驱动,有一个问题迟迟不能解决

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

背景:

主芯片:MK60DN512ZVLQ10 / MK60DN512VLQ10

flash芯片:winbond 25Q64FV

明媚心(415741500)  11:10:44
请教一个spi FLASH的问题。
我最近在搞SPI flash的驱动。
所有的操作都OK了,只有读操作还有一点问题。
问题是这样的:我在读操作的函数里合适的地方设置断点,则每次读到的数据都是正确的。但是如果全速运行,则读到的数据都是0.
从逻辑分析仪上的数据来看,DO端输出的数据都是正确的。

我就又测试了一下自带的SPI FLASH的例程,里面的读操作读到的数据也都是0(不正确)。

从现象上来看,似乎与时序有关。但是逻辑分析仪上的数据看来,似乎又与时序无关。

请教下大家。
孤狼-稀饭  11:15:39
两头都测了吗?
奋斗  11:15:40
时序
有数据出来 CPU 寄存的值为0 是吧
连续读两次试试
明媚心(415741500)  11:17:43
什么叫两头都测了吗?没看懂,
反正设置断点的时候,看到的RXFR寄存器的值也是正确的。即寄存器里的值一直都是正确的。
明媚心(415741500)  11:19:24
断点设置在读函数中不同的位置,寄存器的值一直都是正确的,但是,读出来的值有可能是正确的,也有可能是0(错误的)。
如果不设断点,则都是0.
连续2次,请问是指连续调用读函数两次?
明媚心(415741500)  11:20:27
试过,不管用。因为我每次读操作开始前,都会清寄存器。

 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
好的,以下是一个简单的例程,演示如何在嵌入式Linux中编写SPI驱动程序,用于读写Winbond SPI Flash: 首先,您需要在内核中启用SPI驱动支持。在内核配置中,勾选“SPI Support”和“SPI Master Controller”,并选择您的SPI控制器型号。 接下来,创建一个名为“winbond_spi”或类似的目录,在该目录下创建一个名为“winbond_spi.c”的文件,作为SPI驱动程序的源代码文件。以下是一个简单的驱动程序示例: ```c #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h> #define WINBOND_CMD_READ_ID 0x9f #define WINBOND_CMD_READ_DATA 0x03 static struct spi_device *winbond_spi_device; static int winbond_spi_probe(struct spi_device *spi) { int ret; u8 id[3]; printk(KERN_INFO "winbond_spi: probe\n"); // save the SPI device pointer for later use winbond_spi_device = spi; // read the Winbond Flash ID struct spi_transfer transfer = { .tx_buf = &WINBOND_CMD_READ_ID, .rx_buf = id, .len = 3, }; struct spi_message message; spi_message_init(&message); spi_message_add_tail(&transfer, &message); ret = spi_sync(winbond_spi_device, &message); if (ret < 0) { printk(KERN_ERR "winbond_spi: failed to read Winbond Flash ID\n"); return ret; } printk(KERN_INFO "winbond_spi: Winbond Flash ID: %02x %02x %02x\n", id[0], id[1], id[2]); return 0; } static int winbond_spi_remove(struct spi_device *spi) { printk(KERN_INFO "winbond_spi: remove\n"); return 0; } static struct spi_driver winbond_spi_driver = { .driver = { .name = "winbond_spi", .owner = THIS_MODULE, }, .probe = winbond_spi_probe, .remove = winbond_spi_remove, }; static int __init winbond_spi_init(void) { int ret; struct spi_master *master; printk(KERN_INFO "winbond_spi: init\n"); // find the SPI master controller master = spi_busnum_to_master(0); if (!master) { printk(KERN_ERR "winbond_spi: failed to find SPI master controller\n"); return -ENODEV; } // register the SPI driver ret = spi_register_driver(&winbond_spi_driver); if (ret < 0) { printk(KERN_ERR "winbond_spi: failed to register SPI driver\n"); return ret; } return 0; } static void __exit winbond_spi_exit(void) { printk(KERN_INFO "winbond_spi: exit\n"); // unregister the SPI driver spi_unregister_driver(&winbond_spi_driver); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("Winbond SPI Flash Driver"); module_init(winbond_spi_init); module_exit(winbond_spi_exit); ``` 在该驱动程序中,probe函数用于初始化SPI总线并读取Winbond Flash的ID。在remove函数中,您可以清理和释放设备资源。 通过编写类似的驱动程序,您可以在嵌入式Linux中轻松地实现SPI读写Winbond Flash。需要注意的是,具体的读写操作需要根据Winbond Flash的具体型号和规格进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值