欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决

程序员文章站 2022-06-23 08:42:37
硬件:stm32f103rct6最小系统板,Rtthread V4.0.1问题说明:参考RTthread官网SPI例程,刚开始报错无法查找到"spi10",读取到的全部是ff或者00等。储备知识:SPI 发送数据出来的同时,MISO总线上与此同时会收到数据slaver的数据。所以例程中用5个元素的数组来接收数据,有用数据保存在后面两个元素中,前面三个数据的数值对应的是3个dummy对应的值。解决办法:1:find操作之前将设备attach到SPI总线2:确保w25q15与单片机的连线与程序对应...

硬件:stm32f103rct6最小系统板,
RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决

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之后
RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决

/*
 * 程序清单:这是一个 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);

结果:
RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决
ps:
读取设备ID时序图:
RTThread SPI 读取 W25Q16 设备ID 返回 0XFF,已解决
可以测试下发送数据改为0x90000001时,查看回复的设备ID顺序。

本文地址:https://blog.csdn.net/qq_38944028/article/details/109000828

相关标签: STM32 spi rtos