RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决
程序员文章站
2022-03-08 16:11:45
硬件:stm32f103rct6最小系统板,Rtthread V4.0.1问题说明:参考RTthread官网SPI例程,刚开始报错无法查找到"spi10",读取到的全部是ff或者00等。储备知识:SPI 发送数据出来的同时,MISO总线上与此同时会收到数据slaver的数据。所以例程中用5个元素的数组来接收数据,有用数据保存在后面两个元素中,前面三个数据的数值对应的是3个dummy对应的值。解决办法:1:find操作之前将设备attach到SPI总线2:确保w25q15与单片机的连线与程序对应...
硬件: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 <rtthread.h>
#include <rtdevice.h>
#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%x\n", 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%x\n", id[3], id[4]);
}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample);
结果:
ps:
读取设备ID时序图:
可以测试下发送数据改为0x90000001时,查看回复的设备ID顺序。
本文地址:https://blog.csdn.net/qq_38944028/article/details/109000828