admin 发表于 2019-6-1 21:32:18

【个人笔记】SPI控制器调试心得




自己编写的SPI控制器当前已经通过了回环测试,使用128位宽总线,支持任意长度的数据发送和接收,我这里已经将其封装好,成为了一个Qsys中可用的IP,并在基于软核NIOS II CPU的工程中调试并测试成功,通过逻辑分析仪抓取数据以及串口打印,实测均能正常收发数据。支持传输完成中断信号,支持中断屏蔽寄存器,忙状态寄存器等,以下为寄存器分布结构:

地址0:接收数据寄存器,存储SPI接收到的数据内容
地址1:发送数据寄存器,存储需要通过SPI发送的数据内容
地址2:控制寄存器,向该寄存器中写入本次操作需要传输(发送或收取)的n个字节数,即可触发控制器从发送寄存器中取出n个字节并发送,同时,也会从MISO上接收n个字节的数据存入地址0的接收数据寄存器
地址3:中断屏蔽寄存器,仅bit0有意义,对该位写入1将允许传输完成中断,写入0则关闭中断
地址4:状态寄存器,仅bit0和bit1有意义,
          bit1为SPI忙状态位,SPI在执行一次传输过程中,该位有效,为1;空闲时该位无效,为0;
          bit0为SPI传输完成位,SPI在完成指定长度数据的传输后,该位变为有效,为1;同时,如果使能了中断屏蔽位,则会向CPU发出中断请求。
          既然有中断信号,就需要有清除中断的操作,本控制器清除中断的方法为直接读接收数据寄存器即可自动清除状态寄存器的bit0位。是的,在读接收寄存器的过程中,该状态位就自动被清零了。

                        0:as_readdata <= DATA_IN;      //读接收寄存器
                        1:as_readdata <= DATA_OUT;      //读发送寄存器
                        2:as_readdata <= {120'd0, control};
                        3:as_readdata <= {127'd0, irqmask};
                        4:as_readdata <= {126'd0, status};



附件为完整的测试工程MCP2515_SPI\software\spi_test下的hello_world.c文件为测试程序。提供了简单的测试思路,没有使用中断。
工程下的ip文件夹下有一个spi文件夹,使用时将该文件夹拷贝到您的所需使用的工程的根目录下的ip文件夹内,然后qsys中refresh即可找到该IP。



由于已经对该控制器封装成了Qsys中的IP,如果不需要在Qsys中使用,可以直接去掉av接口封装,直接使用spi_rx_tx作为顶层即可,甚至可以根据特定应用重写spi_rx_tx。比如SD卡一次要传输512个字节的数据


页: [1]
查看完整版本: 【个人笔记】SPI控制器调试心得