TI中文支持网
TI专业的中文技术问题搜集分享网站

EK-TM4C123GXL: 请教使用二片EK-TM4C123GXL,做SPI(SSI)通讯问题

Part Number:EK-TM4C123GXL

TI各位好:
想使用二片板子做SSI通讯,其中遇到问题。

问题1:当Master没发送SSIDataPut,量测CLK没有讯号。有发送SSIDataPut,才会量测到CLK讯号。这样是否正常?

问题2:当SLAVE未收到CLK,是不是不会工作,因为Debug时,发现程式跑完设定参数完后就停止。

目前我Master程式是在While(1)迴圈內打SSIDataPut,才會有一直有CLK出現。

Susan Yang:

您可以看一下 tivaware的安装文件夹内 ti\TivaWare_C_Series-2.1.4.178\driverlib 以及 C:\ti\TivaWare_C_Series-2.1.4.178\examples\peripherals\ssi 内的SSI的驱动具体连接您可以参考Clk-ClkFss-FssTx-RxRx-Tx

,

BEN YU:

感谢回覆,但是还有一些问题想提问,问题1:想询问Slave传送资料至Master时机,我测试时Master接收到资料是错误的。
问题2: FSS接脚还需要额外去控制H,L吗?

,

Susan Yang:

BEN YU 说:问题1:想询问Slave传送资料至Master时机,我测试时Master接收到资料是错误的。

能否详细说明一下?另外您是否有使用示波器观察总线上的情况?

BEN YU 说:问题2: FSS接脚还需要额外去控制H,L吗?

理论上不需要的

,

BEN YU:

程式内查看Master和Slave接收资料状况,Slave接收Master资料是正确,但Master接收Slave资料是错误。

下图黄色波形是FSS和蓝色波形是Master-RX。

Master和Slave程式如下:

SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PA4_SSI0RX); GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |GPIO_PIN_2); while(!SysCtlPeripheralReady(SYSCTL_PERIPH_SSI0)) { } SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER ,500000, 8); //SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, //SSI_MODE_SLAVE,500000, 8); SSIEnable(SSI0_BASE); IntEnable(INT_SSI0);

while(1) {

for(ui32Index = 0; ui32Index <5; ui32Index++) { SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]); SSIDataGet(SSI0_BASE, &pui32DataRx[ui32Index]); } while(SSIBusy(SSI0_BASE)) { } }

,

Susan Yang:

建议您在将

BEN YU 说:for(ui32Index = 0; ui32Index <5; ui32Index++) { SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]); SSIDataGet(SSI0_BASE, &pui32DataRx[ui32Index]); }

替换为类似下面的代码

// // Send 3 bytes of data. // for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++) { // // Display the data that SSI is transferring. // UARTprintf("'%c' ", pui32DataTx[ui32Index]);

// // Send the data using the "blocking" put function. This function // will wait until there is room in the send FIFO before returning. // This allows you to assure that all the data you send makes it into // the send FIFO. // SSIDataPut(SSI0_BASE, pui32DataTx[ui32Index]); }

// // Wait until SSI0 is done transferring all the data in the transmit FIFO. // while(SSIBusy(SSI0_BASE)) { }

// // Display indication that the SSI is receiving data. // UARTprintf("\nReceived:\n ");

// // Receive 3 bytes of data. // for(ui32Index = 0; ui32Index < NUM_SSI_DATA; ui32Index++) { // // Receive the data using the "blocking" Get function. This function // will wait until there is data in the receive FIFO before returning. // SSIDataGet(SSI0_BASE, &pui32DataRx[ui32Index]);

// // Since we are using 8-bit data, mask off the MSB. // pui32DataRx[ui32Index] &= 0x00FF;

// // Display the data that SSI0 received. // UARTprintf("'%c' ", pui32DataRx[ui32Index]); }

,

BEN YU:

感谢回覆,后来测试我更改成如下程式,且FSS功能利用GPIO输出H、L去代替。另外我也做了和Playstation 2 Controller連線控制,也能接收到資料。
while(1){while(SSIDataGetNonBlocking(SSI0_BASE, &pui32DataRx[0])){}GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6,~GPIO_PIN_6);//SysCtlDelay((SysCtlClockGet() / (6500000)));for(SSI_i = 0; SSI_i<5; SSI_i++){SSIDataPut(SSI0_BASE, pui32DataTx[SSI_i]);SysCtlDelay((SysCtlClockGet() / (40000)));}while(SSIBusy(SSI0_BASE)){}//SysCtlDelay((SysCtlClockGet() / (5000000)));GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6,GPIO_PIN_6);SysCtlDelay((SysCtlClockGet() / (50000)));for(SSI_j = 0; SSI_j <5; SSI_j++){SSIDataGet(SSI0_BASE, &pui32DataRx[SSI_j]);pui32DataRx[SSI_j] &= 0x00FF;}}

,

Susan Yang:

谢谢您的反馈,很高兴您能解决问题

赞(0)
未经允许不得转载:TI中文支持网 » EK-TM4C123GXL: 请教使用二片EK-TM4C123GXL,做SPI(SSI)通讯问题
分享到: 更多 (0)