linux的SPI驱动开发中片选问题

束命 2020-02-24 09:07:03
开发SPI驱动,发现连续发送多字节时片选信号并不是一直拉低,是每一个字节拉低再拉高这样。不管是自己用SPI的函数写的驱动,还是直接用源码里面已经有的SPI从设备的驱动,用示波器量的都是这个现象。看到网上有解决办法是把片选信号做成通用IO,自己控制,但求教为什么直接用linux自带的SPI函数就不行,总不能是linux的源码bug吧,我试了4.9和5.3版本的都是这个问题,请各位大神指点迷津!!不胜感激!
...全文
2373 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码本天成 2021-11-05
  • 打赏
  • 举报
回复

我记的Linux下有一个spi_write_then_read的函数,它可以先写寄存器再读,CS是一直拉低的。或者将要发送到的数据打包到一块只用一次发送。

Hello Jason 2021-09-07
  • 打赏
  • 举报
回复

请问你最后怎么解决呢?我的也是发一个字节CS拉高一下。

夏言谦 2021-04-29
  • 打赏
  • 举报
回复
我也是一样的问题,而且更严重,每次写一bit,CS片选就变化一次...
南七技校 2021-01-15
  • 打赏
  • 举报
回复 1
你可以试一试配一下这个unsigned cs_change:1;
南七技校 2021-01-15
  • 打赏
  • 举报
回复 1
struct spi_transfer { /* it's ok if tx_buf == rx_buf (right?) * for MicroWire, one buffer must be null * buffers must work with dma_*map_single() calls, unless * spi_message.is_dma_mapped reports a pre-existing mapping */ const void *tx_buf; void *rx_buf; unsigned len; dma_addr_t tx_dma; dma_addr_t rx_dma; struct sg_table tx_sg; struct sg_table rx_sg; unsigned cs_change:1; unsigned tx_nbits:3; unsigned rx_nbits:3; #define SPI_NBITS_SINGLE 0x01 /* 1bit transfer */ #define SPI_NBITS_DUAL 0x02 /* 2bits transfer */ #define SPI_NBITS_QUAD 0x04 /* 4bits transfer */ u8 bits_per_word; u16 delay_usecs; u32 speed_hz; struct list_head transfer_list; };
南七技校 2021-01-15
  • 打赏
  • 举报
回复
我其实还想这样,应该是可以配的,每个spi_transfer片选一次
john_liqinghan 2020-03-06
  • 打赏
  • 举报
回复
你是不是看错了,你使用示波器测量的吗? 不用怀疑linux,要么是你把sck线当做了cs线,要么是你没有测试对,
lininglive 2020-03-03
  • 打赏
  • 举报
回复
这个要查 spi 控制器的源代码实现,看看是怎设置的了。
Golden_Chen 2020-02-28
  • 打赏
  • 举报
回复
这跟SPI controller有关,就是SPI master驱动相关的,不是SPI device驱动。
有的SPI master ,是连续发,CS一直为低的。 至于你那边的情况,要看SoC上SPI是怎么配置的,理论上,应该有配置项,看看SoC 规格书怎么说的。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧