6线SPI传输模式探索

硬件环境

        4G模块:FIBOCOM_AL940,基于MDM9628 CordX-A7 1.3 GHz单核,RAM 70M ROM 150M,包含两组spi接口,只能做主设备,最大支持50M时钟速率;

        MCU单片机:RH850/F1K,包含两组spi接口,支持主从模式;从模式最大支持5M时钟速率;

        4G模块做主模式,单片机做从设备,4线spi加2根同步线,master_ready输出,slave_ready输入;

主机时序

        从机通过s_r从低到高电平变化通知主机发送时钟信号,时钟个数双方协商4K数据,主机通过改变m_r状态通知从机时钟信号开始:

6线SPI传输模式探索_第1张图片

 调试过程

        红色线s_r管脚,上升沿触发中断后,时钟信号没有出来,但当下降沿后时钟信号出来了,这时候单片机发送了一个字节的数据:

6线SPI传输模式探索_第2张图片

         发送了一个字节数据后就没有继续发送数据,这里就很异常了。6线SPI传输模式探索_第3张图片

        查看单片机的6线spi模式说明手册如下,CSIHTRYO管脚作为输出,低电平忙状态,高电平收发数据状态,所以是上升沿触发4G模块发送时钟信号:

6线SPI传输模式探索_第4张图片

6线SPI传输模式探索_第5张图片

6线SPI传输模式探索_第6张图片

         但从波形图看4G模块没有按照上升沿发送时钟,而是下降沿发送时钟,所以需要修改spi驱动来适配单片机的时序要求。

        看4G模块的spi驱动是上升沿触发中断进行数据收发,怎么修改过来的驱动就是下降沿触发了呢,这里当时没有怀疑也没有进行确认导致了问题。

      gpio_direction_input(fibo_spidev->gpio_slave_ready); //SPI_SRDY has external pull-up
     
	  status = request_irq(gpio_to_irq(fibo_spidev->gpio_slave_ready), spidev_slave_ready_irq_handler,
                                            IRQF_TRIGGER_RISING | IRQF_DISABLED, "ql-spi", fibo_spidev);
        if (status) {
            printk("Fail to request gpio_slave_ready IRQ\n");
        } else {
            fibo_spidev->irq_slave_ready = gpio_to_irq(fibo_spidev->gpio_slave_ready);
            disable_irq(fibo_spidev->irq_slave_ready);
        }
    }

问题解决

        4G模块spi驱动修改为上升沿触发发送时钟信号开始数据收发,6线功能就正常了,但m_r管脚没有使用到,单片机没有管理这个状态也能正常收发,目前测试一个晚上没有丢包的概率发生。

你可能感兴趣的:(Linux,6线spi)