OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3774|回复: 1

IMX6ULL SPI例程触发core错误 icm20608

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2022-5-20
在线时间
11 小时
发表于 2022-8-5 11:32:28 | 显示全部楼层 |阅读模式
1金钱
在学习IMX6ULL SPI教程中(SPI读写icm20608),发现,   1) 如果icm20608_read_regs采用spi_write_then_read()进行数据读写则正常

     static int icm20608_read_regs(struct icm20608_dev *dev, u8 reg,  void *buf, int len)
   {
    int ret = 0;

    struct spi_device *spi = (struct spi_device *)dev->private_data;
    u8 txdata;

    //采用spi接口函数
    txdata = reg | 0x80; //icm20608要求read请求,adress最高位为1
    ret = spi_write_then_read(spi, &txdata, 1, buf, len);
    return 0;
  }

2)如果直接封装spi_transfer,驱动加载时读寄存器(单个)是OK的,但是执行./icm20608App /dev/icm20608则会报如下错误

   
   

   函数封装如下:
    static int icm20608_read_regs_xfer(struct icm20608_dev *dev, u8 reg,  void *buf, int len)
{
    // printk("icm20608_read_regs_xfer Enter\r\n");

    int ret = 0;
    int i = 0;
    struct spi_device *spi = (struct spi_device *)dev->private_data;

    struct spi_transfer  xfer[2];
    struct spi_message m;

    if(len > XFER_BUF_LEN-1){
        printk("len(%d) is invalid, max len is:%d\r\n", len, XFER_BUF_LEN);
        return EPERM;
    }

    mutex_lock(&dev->mutex);

    spi_message_init(&m);
    memset(xfer, 0, sizeof(xfer));

    dev->xfer_buf[0] = reg | 0x80; //icm20608要求read请求,adress最高位为1
    xfer[0].tx_buf = &dev->xfer_buf[0];
    xfer[0].len = sizeof(dev->xfer_buf[0]);
    spi_message_add_tail(&xfer[0], &m);

    xfer[1].rx_buf = &dev->xfer_buf[1];
    xfer[1].len = sizeof(dev->xfer_buf[1]) * len;
    spi_message_add_tail(&xfer[1], &m);

    ret = spi_async(spi, &m);
    if (unlikely(ret)) {
                printk("SPI read error: %d\n", ret);

        mutex_unlock(&dev->mutex);
                return ret;
        }

    memcpy(buf, &dev->xfer_buf[1], len);

    mutex_unlock(&dev->mutex);

    // printk("icm20608_read_regs_xfer End\r\n");

    return 0;
}


最佳答案

查看完整内容[请看2#楼]

最终发现,是把spi_sync()错写成了spi_async()(同时要去掉mutex,即可测试OK)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2022-5-20
在线时间
11 小时
 楼主| 发表于 2022-8-5 11:32:29 | 显示全部楼层
最终发现,是把spi_sync()错写成了spi_async()(同时要去掉mutex,即可测试OK)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 08:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表