Thread 中讨论的其他器件:controlSUITE、 C2000WARE
您好!
我正在体验在 SPI 总线上似乎是"17"位的传输。
我有8个 UCS 连接在一起、它们使用菊花链中的 SPI 总线(SPI-b)进行通信。 UC1与 uC2谈判,uC2与 uC3谈判...... UC8返回 UC1。
UC1是主器件。
数据长度为16位(SpibRegs.SPICCR.bit.SPICHAR = 0x1F;)
SPI 时钟速度非常慢、示波器迹线显示出出色的 SPI 时钟任一侧的设置和保持。
问题:
当我简单地通过主虚拟字路由时、它会通过完美的精细纹波、并且每个 uC (以及主器件)接收的内容是正确的。
但是、当我尝试在流中"注入"数据(即我"覆盖 uC 中的内容)时、返回到主设备(UC1)的数据会损坏。
花了一段时间、但我最终意识到数据正在向左移动1位-这表明 UC 正在计时17位!
例如、我注入8345 (1000-0011-0100-0101)、然后返回068B (0000-0110-1000-1011)-左移1位。 我使用了许多不同的数据模式、结果是相同的。
我已经阅读了 SPI 手册封面到封面上的十几次、我尝试了不同的速度(我认为这不可能是因为"虚拟"数据在所有速度下都能完美运行)。
我已经检查以确保没有杂散边沿(时钟"恢复状态"为低电平)
我已检查"勘误表"数据、但与 SPI 无关。
请任何人帮忙-我被骗了
我包括一些与 SPI 设置相关的代码部分
SPI_SET_UP { EALLOW; //将所选引脚的限定条件设置为仅异步*/ //这将为所选引脚选择异步(无限定条件)。 GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 3;//异步输入 GPIO12 (SPISIMOB) GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 3;//异步输入 GPIO13 (SPISOMIB) GpioCtrlRegs.GPAQSEL1.bit.GPIO14 = 3;//异步输入 GPIO14 = GPIO14.KB = GPIO3KB;GPIOL.GPIO3/ GPIO1.GPIO1.GPIO1.GPIO3KB = GPIO1.GPIO1.GPIO3KB //异步输入 GPIO14 (!SPISTEB) //使用 GPIO 寄存器配置 SPI-B 引脚*// 这指定哪些可能的 GPIO 引脚将是 SPI 功能引脚。 GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 3;//将 GPIO12配置为 SPISIMOB GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 3;//将 GPIO13配置为 SPISOMIB GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 3;/ GPICl14 = 3;GPICOL = 3;GPICOL = 3;GPICOL = GPO14 = GPICOL = 3;GPICOL = 3 //将 GPIO115配置为 SPISTEB //为所选引脚启用内部上拉 //用户可以启用或禁用上拉。 //这将启用指定引脚的上拉电阻。 GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;//启用 GPIO12上的上拉(SPISIMOB) GpioCtrlRegs.GPAPUD.bit.GPIO13 = 0;//启用 GPIO13上的上拉(SPISOMIB) GpioCtrlRegs.GPAPUD.bit.GPIO13上拉 ;//启用 GPIO14上拉(SPIC.SPIC.0KB)/SPICOL = 0KB;GPIO14位/SPIC.GPIO14 = 0KB;GPIO14 = SPIC.SPICR.GPIO14;SPIC.GPIO14 =所有引脚 环回关闭 SpibRegs.SPIBRR = 0x19;//SPI 时钟速度-慢 SpibRegs.SPICTL.ALL = 0x02;//CLK_PHASE = 0、启用数据传输、禁用 SPI 中断(轮询)、// 0 =从器件; SpibRegs.SPICCR.ALL = 0x8F;//清除 SPI 复位 }
我的代码转至 tranmsit (Master)
void read_spi_Data (void)
{
receive_Count = 0;
dmummy = 0x0F0F;
SpibRegs.SPITXBUF = dmummy;//加载带有第一个字节的 Tx 缓冲区- dmummy -在
(SpibRegs.SPISTS.bit.INT_flag!= 1)//未在缓冲区中接收到字符时启动时钟
;SpibRegs.SpibRegs.spirt.pummy =
//清除标志(读取 Rx 缓冲器)
SpibRegs.SPITXBUF = Command_Message;//使用下一个字加载 TxBuffer (即命令字
)// Command_Message 启用/禁用 O/PS 并设置覆盖等
,而(SpibRegs.SPISTS.bit.INT_flag!=1)//没有收到字符时
,SpibRegs.SpibUrl 缓冲区中的字符
= SpibUrummy 缓冲区 //清除标志(读取 Rx 缓冲器)
虚拟= 0x6789;//
while (Receive_Count < 35) //receive_Count 是预期字数=
{
SpibRegs.SPITXBUF =虚拟; //使用下一个字加载 TxBuffer
//后续行检查是否设置 Rx 标志-表示 SPI 总线已接收到一个字
,同时(SpibRegs.SPISTS.bit.INT_flag !=1)//在缓冲区中没有接收到字符-轮询标志
{}
test = SpibRegs.SPIRXBUF; //清除标志(读取 Rx 缓冲区)
SPI_RxArray[Receive_Count]= test;//将接收到的数据放入 RxArray
Receive_Count++中;//递增到下一个接收到的字
}
Receive_Count = 0;//读取完成
后重置计数器 test = 0;
}
从机读取
void transmit _SPI_Data (void)
{
receive_Count = 0;
//后续注释应用于'first' uC。
//后续 UC 也会收到类似的信息,但有差距!
//第一个接收到的字是虚拟字,用于启动传输
//第二个接收到的字是命令字-当调用此函数
时收到该字(Receive_Count < 37)//Receive_Count 是预期字的数量
{
local_buffer = SpibRegs.SPIRXBUF
local_buffer = 0x8345; // 'this'="" device="" -="" route="" it="" through="" receive_count++;="" while="" (spibregs.spists.bit.int_flag="" !="1)" received="" character="" in="" buffer="" poll="" flag="" {="" }="" function="" resets="" timer="" reset="" everything!="" receive_count="0;" counter="" transmit_count="0;" transmit="" count=""