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:
谢谢您的反馈,很高兴您能解决问题