Other Parts Discussed in Thread: AM3358, TPS3809
部件号: AM3358
主题中讨论的其他器件: TPS3809
你好。
我正在为工业传感器编写一个 Linux 内核驱动程序、我使用的是 BeagleBone Black (AM3358BZCZ100) 开发板。 处理器是 SPI 主器件。
我观察到、在某些情况下、写入 OMAP2_MCSPI_TX0 寄存器的字节在 MOSI 线路上输出不同。 据我所知、cs 置为有效后的第一个字节有时会受到影响 — 应为 1 的位有时为 0。 它可以每次在几个数据包上复制一次。
我修改了 drivers/spi/spi-OMAP2-mcspi.c 文件、以打印写入 TX 寄存器的所有字节和一些额外变量:
@@–722、6 +724、8 @@ OMAP2_mcspi_txrx_Pio(结构 SPI_DEVICE *SPI、结构 SPI_TRANSFER *xfer)
RX_reg = BASE + OMAP2_MCSPI_RX0;
chstat_reg = BASE + OMAP2_MCSPI_CHSTAT0;
+ pr_info(“Pio %d 0x%x 0x%p 0x%p 0x%p\n“、xfer->len、l、tx_reg、rx_reg、 chstat_reg);
+
if (c <(word_len>>3))
返回 0;
@@–735、6 +739、7 @@ OMAP2_mcspi_txrx_Pio(结构 SPI_DEVICE *SPI、结构 SPI_TRANSFER *xfer)
执行{
C -= 1;
if (TX!= NULL){
+ PR_INFO(“%02x\n",“,*tx、*tx);
if (mcspi_wait_for_reg_bit (chstat_reg、
OMAP2_MCSPI_CHSTAT_TXS)< 0){
DEV_err(&spi->dev、“TX 超时\n“);
并且 dmesg 输出看起来正确(这使得内核错误的可能性不那么普遍)。
使用 Logic Pro 信号分析仪观察 MOSI 信号时、会有一个 0x70、而不是发送到 TX 寄存器的 0xf0。 如果我们看一下在第一个位在时钟沿输出 MOSI 线路时的模拟信号捕获、则信号为 500mV、因此第一个位读取为 LO 而不是 HI — 请参阅屏幕截图。 我看到、每当该位错误时、模拟电压始终在 500mV 左右。
在 AM335x 勘误表中的 SPI 快速搜索显示无结果。 在两个不同的开发板上进行了测试、两个开发板相隔几年、结果相同。
我的驱动程序代码和设备树文件可以在这里找到: https://codeberg.org/subDIMENSION/lkm_sandbox/src /branch/main/honeywell_abp2030pa
您是否收到过有关此问题的任何反馈?
另外需要注意的是、Linux 内核中的 OMAP2-mcspi 驱动程序忽略了芯片选择相关的延迟、有时在 cs 被断言违反传感器时序图后生成时钟信号 0.6us。 稍后我将发送一个补丁。
稍后编辑:
我还尝试过什么,但没有工作
-将 SCLK 从 800kHz 降至 100kHz
-在 CS 下降边沿和 SCLK 开始之间插入较大的延迟
-在 mcspi 驱动程序中禁用了 mcspi 自动挂起/自动恢复
-在 MISO 线上增加了一个 100K 下拉电阻,希望安静下来的空闲信号,但它仍然在 1V 左右
谢谢你。
彼得
屏幕截图:







