完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
硬件:stm32f103rct6最小系统板,
Rtthread V4.0.1 问题说明:参考RTthread官网SPI例程,刚开始报错无法查找到"spi10",读取到的全部是ff或者00等。 储备知识:SPI 发送数据出来的同时,MISO总线上与此同时会收到数据slaver的数据。所以例程中用5个元素的数组来接收数据,有用数据保存在后面两个元素中,前面三个数据的数值对应的是3个dummy对应的值。 解决办法: 1:find操作之前将设备attach到SPI总线 2:确保w25q15与单片机的连线与程序对应 3:修改 bsp ,SPI_NSS必须使用软件控制模式(之前就是使用的是硬件NSS,导致一直读出ff) 4: 配置SPI工作模式,configure操作在find之后 /* * 程序清单:这是一个 SPI 设备使用例程 * 例程导出了 spi_w25q_sample 命令到控制终端 * 命令调用格式:spi_w25q_sample spi10 * 命令解释:命令第二个参数是要使用的SPI设备名称,为空则使用默认的SPI设备 * 程序功能:通过SPI设备读取 w25q 的 ID 数据 */ #include #include #include "drv_spi.h" #define W25Q_SPI_DEVICE_NAME "spi30" static void spi_w25q_sample(int argc, char *argv[]) { struct rt_spi_device *spi_dev_w25q; char name[RT_NAME_MAX]; rt_uint8_t w25x_read_id = 0x90; rt_uint32_t w25x_read_id1=0x00000090; rt_uint8_t id[5] = {0}; rt_uint8_t id1[2] = {0}; if (argc == 2) { rt_strncpy(name, argv[1], RT_NAME_MAX); } else { rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX); } /* 将设备W25q16 添加到 SPI总线 SPI3 */ rt_hw_spi_device_attach("spi3", "spi30", GPIOA, GPIO_PIN_15); /* 查找 spi 设备获取设备句柄 */ spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name); if (!spi_dev_w25q) { rt_kprintf("spi sample run failed! can't find %s device!n", name); } else { { /* 配置SPI*/ struct rt_spi_configuration cfg; cfg.data_width = 8; cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_3 | RT_SPI_MSB; cfg.max_hz = 20 * 1000 *1000; /* 20M */ rt_spi_configure(spi_dev_w25q, &cfg); } /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */ rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id1, 4, id1,2); rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%xn", id1[0], id1[1]); /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */ struct rt_spi_message msg1, msg2; msg1.send_buf = &w25x_read_id; msg1.recv_buf = RT_NULL; msg1.length = 1; msg1.cs_take = 1; msg1.cs_release = 0; msg1.next = &msg2; msg2.send_buf = RT_NULL; msg2.recv_buf = id; msg2.length = 5; msg2.cs_take = 0; msg2.cs_release = 1; msg2.next = RT_NULL; rt_spi_transfer_message(spi_dev_w25q, &msg1); rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%xn", id[3], id[4]); } } /* 导出到 msh 命令列表中 */ MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample); 结果: ps: 读取设备ID时序图: 可以测试下发送数据改为0x90000001时,查看回复的设备ID顺序。 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:44 , Processed in 1.227867 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号