工具/软件:Code Composer Studio
您好!
我有两块板、一个是 TM4CZAD 定制设计、 另一个是 TI TM4C129EXL 开发板。 这两个板通过 QSSI、定制板上的端口1、TI 开发板上的端口3进行连接。 我已经使用几种工作模式测试了 QSSI:
自定义设置为主 QSSI、向接头连接器(使用 DSO 探测连接器)写入8位帧- CSS、CLK 和4条数据线按预期工作。 注意:定制板没有外部晶振;时钟通过片上时钟源。
TI 电路板设为主 QSSI、向与端口3对应的 BoosterPack HDR 引脚写入8位帧。 同样、使用 DSO 探测连接器引脚可按预期工作。
3.自定义电路板设为主 QSSI,TI DEV 设为从 QSSI,主器件向从器件发送一个8位序列(自定义 BD 至 TI DEV BD),从器件接收数据,两个电路板 的开关模式,以便主器件从写模式切换到读模式, TI 开发 BD 从读取切换到写入、然后从电路板将数据发送回主器件(或主器件从从从从器件读取数据-这是我的困惑所在、这部分事务是如何启动的、从器件将数据发送回主器件?)
此时、当主器件发出 SSIDataGet 并且从器件已到达对 SSIDataPut 的调用时、案例#3失败。 在从主器件到从器件的初始写入之后、不会发送任何数据(在示波器上观察)、并且两个调试器会话(一个连接到主器件、另一个连接到从器件)滞留在这两个 SSIDataXXX 调用中。
我一直在研究以下以前的论坛;
https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/341195/1202177#1202177
我认为,我已经应用了所提出的所有建议。 我认为我在这里做了一些根本错误的事情、但似乎无法让我的头脑四处走动。 希望这里的人能让我走上正轨。
主代码段来自 main:
InitGPIO();
SysCtlClockFreqSet (SYSCTL_OSC_INT、SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL);
时钟= SysCtlClockGet ();
Board_initQSSI (clock、baud _rate、0);
SSIDataPut (SSI1_base、0xA5);
SSIAdvModeSet (SSI1_base、SSI_ADV_MODE_Quad_Read);
//SSIDataPutNonBlocking (SSI1_base、0x4000); //虚拟写入以使时钟运行到配置从器件、0x20=QuadMode ->这没什么区别
while (1)
{
SSIDataGet (SSI1_base、rcv_data);---------- >在这里挂起
System_printf ("已接收:%d\n"、rcv_data[0]);
//SysCtlDelay (1000);
}
从器件的主代码段
Board_initGeneral();
Board_initGPIO();
Board_initEMAC();
Board_initUART();
//Board_initSPI ();
时钟= MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
Board_initQSSI (clock、baud _rate、1);
while (go =0)
{
SSIDataGet (SSI3_base、dataBuffer);
if (dataBuffer[0]=165)
GO = 1;
}
SSIAdvModeSet (SSI3_base、SSI_ADV_MODE_Quad_WRITE);
SSIDataPutNonBlocking (SSI3_base、0x4000); //虚拟写入以使时钟运行到配置从器件
system_printf ("切换到发送模式\n");
while (1){
SSIDataPut (SSI3_base、0x53);--- >在这里挂起
System_printf ("已发送%x\n"、0x53);
//SysCtlDelay (1000);
}
最后、上述每个指令中对 Board_initQSSI 的调用、其中最后一个输入参数为0、对应于主控方;1、corrsp 对应于从控方:
void Board_initQSSI (uint32_t SYSCLK_Freq、uint32_t baud _rate、bool 从站)
{
//启用 QSSI 外设
if (slave=0){ //在 QSSI1 - RevX 主设备上使用端口 B、D、E
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
}
否则{ //在 QSSI3 - TI 开发 BD 从设备上使用端口 P、Q
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_SSI3);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOQ);
}
//通过复用设置实现引脚功能。 这个宏被映射到 ROM_MAP.h 内的 GPIOPinConfigure
// GPIOPinConfigure 在 GPIO.c 中为 def
if (slave=0){ //使用 QSSI1上的端口 B、D、E
MAP_GPIOPinConfigure (GPIO_PB5_SSI1CLK);
MAP_GPIOPinConfigure (GPIO_PB4_SSI1FSS);
MAP_GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
MAP_GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
MAP_GPIOPinConfigure (GPIO_PD4_SSI1XDAT2);
MAP_GPIOPinConfigure (GPIO_PD5_SSI1XDAT3);
}
否则{ //使用 QSSI3上的端口 P、Q
MAP_GPIOPinConfigure (GPIO_PQ0_SSI3CLK);
MAP_GPIOPinConfigure (GPIO_PQ1_SSI3FSS);
MAP_GPIOPinConfigure (GPIO_PQ2_SSI3XDAT0);
MAP_GPIOPinConfigure (GPIO_PQ3_SSI3XDAT1);
MAP_GPIOPinConfigure (GPIO_PP0_SSI3XDAT2);
MAP_GPIOPinConfigure (GPIO_P1_SSI3XDAT3);
}
//引脚操作设置。 这个宏被映射到 ROM_MAP.h 内的 GPIOPinTypeSSI
// GPIOPinTypeSSI 在 GPIO.c 中为 def
if (slave=0){ //使用 QSSI1上的端口 B、D、E
MAP_GPIOPinTypeSSI (GPIO_PORTB_AHB_BASE、GPIO_PIN_5 | GPIO_PIN_4);
MAP_GPIOPinTypeSSI (GPIO_PORTD_AHB_BASE、GPIO_PIN_4 | GPIO_PIN_5);
MAP_GPIOPinTypeSSI (GPIO_Porte AHB_BASE、GPIO_PIN_4 | GPIO_PIN_5);
}
否则{ //使用 QSSI3上的端口 P、Q
MAP_GPIOPinTypeSSI (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1);
MAP_GPIOPinTypeSSI (GPIO_PORTQ_BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
}
//针对 QSSI (高级)模式设置为 SPI 模式0;设置主模式
if (slave=0){
MAP_SSIConfigSetExpClk (SSI1_base、SYSCLK_Freq、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、BAUD_RATE、 8);
SSIAdvModeSet (SSI1_base、SSI_ADV_MODE_Quad_WRITE);
}
否则{
SSIConfigSetExpClk (SSI3_base、SYSCLK_Freq、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、BAUD_RATE、 8);
SSIAdvModeSet (SSI3_base、SSI_ADV_MODE_Quad_Read);
SSIDataPut (SSI3_base、0x4000); //虚拟写入以使时钟运行到配置从器件
}
//启用 QSSI
if (slave=0){
MAP_SSIEnable (SSI1_BASE);
}
否则{
MAP_SSIEnable (SSI3_base);
}
对 SSIDataPut 的调用是根据上述参考论坛的指导添加的。
总之、主器件最初向从器件发送一个帧、从器件接收该帧、然后继续切换模式、从读取模式切换到写入模式。 与此同时、主器件从写入切换到读取。
我正在运行此命令、以便从机可以运行、在第一个(也是唯一的) SSIDataGet 处等待。 在两个电路板上使用调试器进行步进、在两个电路板上完成对开关模式的调用后、操作停止。
我可以用一些帮助来解决这个问题 -任何建议都值得赞赏。
谢谢你。