单片机学习小组
直播中

efwedfd

8年用户 1048经验值
擅长:EMC/EMI设计
私信 关注

RTThread SPI读取W25Q16设备ID返回 0XFF的问题怎么解决?

RTThread SPI读取W25Q16设备ID返回 0XFF的问题怎么解决?

回帖(1)

路云芳

2022-2-17 12:00:38
硬件: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顺序。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分