linux spi 工作模式,AM335X 作为SPI主机,设置工作模式为Master Receive-Only Mode,三线模式。SPI总线什么时候开始一次传输?...

linux内核版本:3.2

背景:

使用AM335X的SPI模块和EDMA传输数据。去除linux内核里omap2自带的SPI驱动,自己写了一个驱动模块(只是大致写了,作为测试使用),直接配置寄存器(主要是MCSPI相关寄存器、EDMA相关寄存器、模块时钟寄存器)。配置AM335X为主机,工作模式为Master Receive-Only Mode,三线模式,spi字为24位,关闭发送、接收中断。使用SPICS0引脚触发DMA传输,打算让DMA将MCSPI_RX0寄存器里的内容传到自己申请的一个缓存区域,并打印出来。上述操作均放在module_init函数里,insmod安装内核模块时会执行上述操作。insmod安装该模块时,打印出缓存区域里全是0,直接读MCSPI_RX0寄存器发现也全为0。用示波器测试了一下SPI1的CLK引脚,没有时钟输出。

打印出来的寄存器配置如下:

[STEP]# gpios init:

[ 2292.290905] [CM_PER]# L4LS_CLKSTCTRL: 1A024D02

[ 2292.295533] [CM_PER]# SPI1_CLKCTRL: 00000002

[ 2292.300173] [McSPI] Soft Reset OK.

[ 2292.303714] [McSPI-CH0]# REG_MCSPI_CHCONF0: 00061B8C

[ 2292.308892] [McSPI-CH0]# REG_MCSPI_CHSTAT0: 00000000

[ 2292.314065] [McSPI-CH0]# REG_MCSPI_CHCTRL0: 00000000

[ 2292.319242] [McSPI]# Channel-0 Enable.

[ 2292.323144] [McSPI-CH0]# REG_MCSPI_CHCTRL0: 00000001

[ 2292.328336] [McSPI-CH0]# After TX Write: CHSTAT0: 00000000

[ 2292.334049] [McSPI-CH0]# REG_MCSPI_RX0 : 00000000

[ 2292.339228] [McSPI-CH0]# REG_MCSPI_CHSTAT0: 00000000

[ 2292.344400]

[ 2292.344403]

[ 2292.344406] [McSPI-CH0]# REG_MCSPI_CHCONF0: 00061B8C

[ 2292.352665] [McSPI-CH0]# REG_MCSPI_CHSTAT0: 00000000

[ 2292.357845] [McSPI-CH0]# REG_MCSPI_CHCTRL0: 00000001

[ 2292.363015] [McSPI-CH0]# REG_MCSPI_TX0: 00000000

[ 2292.367831] [McSPI-CH0]# REG_MCSPI_RX0: 00000000

[ 2292.372638]

[ 2292.374184] [McSPI]# REG_MCSPI_SYSCONFIG: 00000015

[ 2292.379180] [McSPI]# REG_MCSPI_SYSSTATUS: 00000001

[ 2292.384171] [McSPI]# REG_MCSPI_IRQSTATUS: 00000000

[ 2292.389167] [McSPI]# REG_MCSPI_IRQENABLE: 00000000

[ 2292.394155] [McSPI]# REG_MCSPI_SYST: 00000100

[ 2292.398700] [McSPI]# REG_MCSPI_MODULCTRL: 00000003

[ 2292.403689] [CONF_MII1]# REG_CONF_MII1_COL : 00000022

[ 2292.408956] [CONF_MII1]# REG_CONF_MII1_CRS : 0000003A

[ 2292.414219] [CONF_MII1]# REG_CONF_MII1_RX_ER : 00000022

[ 2292.419668] [CONF_MII1]# REG_CONF_MII1_REF_CLK : 00000029

补充:TRM手册说如果工作在Master Receive-Only Mode,需要提前网tx0寄存器写入一些值,我配置的时候往里面写了0。

问题:

1、为何我insmod内核模块时,CLK引脚没有时钟输出。按我想的,执行module_init函数时DMA会读取RX0寄存器的值,已经开始传输数据了,按理说有时钟输出啊。

2、AM335X的SPI是如何开始一次传输的?只要往TX0寄存器写入内容,或者读取RX0寄存器就算开始传输了吗?

有没有人能解释一下?谢谢各位!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值