工具/软件:Linux
您好!
我将 OMAP-L138 LCDK 与嵌入式 Linux 配合使用。 到目前为止、我已经成功地在用户空间中实现了 GPIO 和 UART、但我在 SPI 的实现方面遇到了一些问题。 我已成功实现 SPI 通信、在 SOMI 和 SIMO 短接在一起时成功读取和写入;但是、当我尝试更改配置(MSB 优先、无奇偶校验等)时、输出波形中似乎没有任何变化。
默认情况下、奇偶校验显示为"ODD Parity、LSB 优先"。 当我尝试发送"0xA0A0"时,我看到0b000001011在输出上重复两次。 在给定相同的发送缓冲器的情况下、无论配置如何、输出都不会改变。
在 Linux 中、存在以下文件:
/sys/class/spi_master/spi1存在
/sys/class/spidev/spidev1.0 /sys/class/spidev/spidev1.1存在
/sys/class/spi_master/spi1
和
CAT /sys/class/spi_master/spi1/device/modalias
读取 platform:SPI_Davinci
我认为这意味着系统将 SPI_DaVinci 设置为控制器驱动程序、而 spidev 是协议驱动程序。 这是正确的实施/理解吗?
我对文件进行了以下更改:
Board-omapl138-lcdk.c 编辑:
//Davinci_SPI_config:
静态结构 Davinci_SPI_config da850evm_SPI_cfg ={
.wdelay= 2、
.io_type= SPI_IO_TYPE_POLL、
.c2tdelay= 8、
.t2cdelay= 8、
.paracy_enable = 0、
.odate_parity = 0、
};
//spi_board_info
静态结构 spi_board_info da850evm_spi_info[]={
.modalias="spi_Davinci"、
.controller_data=&daevm_spi_cfg、
.mode= spi_mode_0、
.max_speed_Hz= 80000、
.bus_select
= 850num、.chin = 1、850num = 1、.chie_selt = 1、850num = 1、850num
{
.modalias="SPI_DaVinci"、
.controller_data=&d850evm_SPI_cfg、
.mode= SPI_mode_0、
.max_speed_Hz= 80000、
.bus_num= 1、
.chip_select= 1、
}、
};
//spi_init
静态空 omapl138_lcdk_spi_init (void)
{
int ret;
ret = davinci_cfg_reg_list (da850_SPI1_pins);
if (ret)
pr_warn ("daopl138_lcdk_init:SPI1 mux 设置失败:%d\n"、spi_evm
);
spi_reg_size (spi_ref = 850m、spi_ref);
如果(ret)
pr_warning ("omapl138_lcdk_init:SPI 1注册失败:%d\n"、
ret);
}
device-da8xx 更改:
//SPI 资源: 静态结构资源 da8xx_spi0_resources[]={ [0]={ .start= DA8XX_SPI0_BASE、 .end= DA8XX_SPI0_BASE + SZ_4K - 1、 .flags= IORESOURCE_MEM、 }、 [1]={ .start= DA8XX_SPIOR0_ORTS_INQ_OR_ORTS=.OR0_ORTANQ_OR_ORTS_ORTS=.ORTA_INQ_ORTS_ORTS_ORTS=.OR_ORTANT_ORTQ_OR_ORTS=.OR0_OR_ORTS_ORTS_ORTS_ORTA_INQ_OR_ORTS=.OR_ORTANT_ORTS=.ORTA_INQ_OR_ORTS= .OR }、 [3]={ .start= DA8XX_DMA_SPI0_TX、 .end= DA8XX_DMA_SPI0_TX、 .flags= IORESOURCE_DMA、 }、 }; 静态结构资源 da8xx_SPI1_resources[]={ [0]={ .start= DA850_SPI1_base、 .end= DA850_SPI1_base + SZ_4K - 1、 .flags= IORESOURCE_MEM、 }、 [1]={ .start= IRQ_DA8XX_base + SZ_4K - 1、.flags = IORESORCE_ORE_ORT1_ORT1_ORT1_ADMEM 、}、[IRQ_INORT1_INORT1_INESOR_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ENTS = IRQ_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_ORT1_OR [3]={ .start= DA8XX_DMA_SPI1_TX、 .end= DA8XX_DMA_SPI1_TX、 .flags= IORESOURCE_DMA、 }、 }; //平台数据: struct Davinci_SPI_platform_data da8xx_SPI_pdata[]={ [0]={ .version= SPI_version_2、 .intr_line= 1、 .dma_event_q= EVENTQ_0、 }、 [1]={ .version= SPI_version_2、 .intr_line= 1、.intr_event_q = EVENTQ_0、} //平台器件: 静态结构 platform_device da8xx_spi_device[]={ [0]={ .name="spi_Davinci"、 .id= 0、 .num_resources= array_size (da8xx_spi0_resources)、 .resource= da8xx_spi0_resources、 .dev={ .platform_data = }、[spi_data] 、[spi_1]、[spi_data/]= 1}、[spi_name/.data] 用于匹配驱动 程序.id= 1、 .num_resources= array_size (da8xx_SPI1_resources)、 .resource= da8xx_SPI1_resources、 .dev={ .platform_data =&da8xx_SPI_pdata[1]、 }、 }、 };
此外、在我的用户空间代码 ioctl (fd、SPI_IOC_RD_LSB_FIRST、&lsb)中;显示 lsb 设置为零、向我表明驱动程序认为控制器首先配置了 MSB。 由于波形看起来指示为其他状态、因此我连接了调试器(XDS100v2)并在启动用户空间代码后转储寄存器。 我找到了以下内容(在 SPI1ARM 下):
SPICGR0 = 0x00000001
SPICGR1 = 0X00000103
SPIFMT_1 = 0X3FF7EA08
PARENA=1 (被启用)
SHIFTDIR = 1 (LSB 优先)
如果我尝试按我想要的方式手动设置这些寄存器(无奇偶校验、MSB 在前)、则当我下次停止处理器时、这些值将被复位。 这似乎表明处理器上运行的代码正在将值设置为不正确的值。
我还尝试在 SPI_Davinci.c 中的任何位置消除设置 LSB_FIRST 对波形没有影响的情况。
我是否忽略了某些内容? 外设的配置似乎应该是一个简单的操作、但事实证明它比我预期的要困难。 如果我可以提供更多信息来帮助解决此问题、请告诉我。
JLimbocker