我已经用自己的头在墙上打了几天、试图弄清楚 SPI 总线通信可能出现的问题。 我使用一条总线与两个不同的器件通信。 器件 A 使用8位数据宽度、器件 B 使用16位数据宽度。
如果我从未与 器件 B 通信、则与器件 A 的通信正常。 但是、如果我与器件 B 通信、然后切换到器件 A、我会遇到奇怪的行为。
我正在使用 Beagle SPI 总线监听器来检查在 Tiva 和设备 A 之间传输的数据。当我向设备 A 发送0xB0命令代码时、监听器会显示正在传输一个包含正确值的字节。 但是、如果我首先与器件 B 通信、当我将 SPI 重新配置为8位模式并将0xB0发送到器件 A 时、监听器会指示发送了2个字节- 0x58和0x00。 值得注意的是、0x58是向右移动一位的0xB0。 监听 器还会为事务标记"部分最后字节"错误。 后续交易似乎可以。
在两种情况下(与器件 B 通信之前和之后)、我都在发送之前检查了 SSI 寄存器的内容、它们是相同的:
SSI_CR0 0x000013C7 SSI 控制0 [存储器映射]
SSI_CR0_SCR 00010011 SSI 串行时钟速率
SSI_CR0_SPH 1 SSI 串行时钟相位
SSI_CR0_SpO 1 SSI 串行时钟极性
SSI_CR0_FRF 00 - SSI 帧格式选择
SSI_CR0_DSS 0111 - SSI 数据大小选择
SSI_CR1 0x00000000 SSI 控制1 [存储器映射]
SSI_CR1_EOM 0停止帧(消息结束)
SSI_CR1_FSSHLDFRM 0 FSS 保持帧
SSI_CR1_HSCLKEN 0高速时钟使能
SSI_CR1_DIR 0 SSI 工作方向
SSI_CR1_MODE 00 - SSI 模式
SSI_CR1_EOT 0传输结束
SSI_CR1_MS 0 SSI 主/从选择
SSI_CR1_SSE 0 SSI 同步串行端口使能
SSI_CR1_LBM 0 SSI 环回模式
SSI_DR 0x00000000 SSI 数据[存储器映射]
SSI_SR 0x00000003 SSI 状态[存储器映射]
SSI_SR_BSY 0 SSI 忙位
SSI_SR_RFF 0 SSI 接收 FIFO 满
SSI_SR_RNE 0 SSI 接收 FIFO 不为空
SSI_SR_TNF 1 SSI 发送 FIFO 未满
SSI_SR_TFE 1 SSI 发送 FIFO 空
SSI_CPSR 0x00000002 SSI 时钟预分频[存储器映射]
SSI_IM 0x00000000 SSI 中断屏蔽[存储器映射]
SSI_RIS 0x00000048 SSI 原始中断状态[存储器映射]
SSI_MIS 0x00000000 SSI 屏蔽中断状态[存储器映射]
SSI_ICR 0x00000000 SSI 中断清除[存储
器映射] SSI_DMACTL [Memory 映射]
SSI_PP 0x0000000D SSI 外设属性[存储器映射]
SSI_CC 0x00000000 SSI 时钟配置[存储器映射]
如果 SSI 寄存器在这两种情况下都相同、您有什么想法吗? 您有什么建议可以让我找到更多线索、或者解决此问题的任何可能方法吗?
此致、
Dave