主题中讨论的其他器件:TM4C123、 EK-TM4C123GXL、 TMS320F28377D
工具/软件:Code Composer Studio
大家好、
我正在尝试(希望) 通过 SPI 通信发送浮点数据类型数组。 我从"TivaWare_C_Series-2.1.3.156" SSI 示例开始、该示例处于主模式、使用户能够以 uint32数据类型传输数据。
这是我 正在处理的代码
float pui32DataTx[4]={0000,1001,768,1010}; float pui32DataRx[4]; uint32_t ui32Index; int i; int main (void) { // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 板上的//晶体。 // SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); // //必须启用 SSI0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_SSI0); // //对于本示例,SSI0与 Porta[5:2]一起使用。 实际端口和引脚 //您的器件上使用的可能不同、请参阅数据表以了解更多信息 //信息。 GPIO 端口 A 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A2、A3、A4和 A5上的 SSI0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA2_SSI0CLK); GPIOPinConfigure (GPIO_PA3_SSI0FSS); GPIOPinConfigure (GPIO_PA4_SSI0RX); GPIOPinConfigure (GPIO_PA5_SSI0TX); // //配置 SSI 引脚的 GPIO 设置。 该函数也会提供 将这些引脚的//控制到 SSI 硬件。 请参阅中的数据表 //查看每个引脚分配的函数。 //引脚分配如下: // PA5 - SSI0Tx // PA4 - SSI0Rx // PA3 - SSI0Fss // PA2 - SSI0CLK // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); // //为 SPI 主控模式配置和启用 SSI 端口。 使用 SSI0、 //系统时钟电源,空闲时钟低电平和低电平有效时钟输入 //飞思卡尔 SPI 模式、主控模式、1MHz SSI 频率和8位数据。 //对于 SPI 模式,可以设置 SSI 时钟的极性 //单元空闲。 您还可以配置所需的时钟边沿 //在上捕获数据。 有关的更多信息、请参阅数据表 //不同的 SPI 模式。 // SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、 SSI_MODE_MASTER、1000000、8); // //启用 SSI0模块。 // SSIEnable (SSI0_BASE); // //从 SSI 端口读取任何残留数据。 这将确保接收 // FIFO 为空,因此我们不会读取任何不需要的垃圾。 这在这里完成 //因为 SPI SSI 模式为全双工模式,允许您发送和 //同时接收。 SSIDataGetNonBlocking 函数返回 //返回数据时为"true",未返回数据时为"false"。 //“非阻塞”函数检查接收中是否有数据 // FIFO、如果没有、则不会"挂起"。 // //while (SSIDataGetNonBlocking (SSI0_BASE、&pui32DataRx)); // //发送 n 个字节的数据。 // for (ui32Index = 0;ui32Index < 4;ui32Index++) { for (i=0;i<4;i++) { // //使用“阻塞”Put 函数发送数据。 此函数 //将等待发送 FIFO 中有空间后再返回。 //这使您可以确保发送的所有数据都将其输入 //发送 FIFO。 // SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]>>>(i*8)); // //等待 SSI0完成传输发送 FIFO 中的所有数据。 // while (SSIBusy (SSI0_BASE)); // // SSIDataGet (SSI0_BASE、&pui32DataRx); // //等待 SSI0完成传输发送 FIFO 中的所有数据。 // //while (SSIBusy (SSI0_BASE)); //} SysCtlDelay (2000);//我必须添加此延迟以避免在 }之间丢失通信 while (1); }
使用上述 TIVAware 中的 SSI 库、通过该函数处理传输
void
SSIDataPut (uint32_t ui32Base、uint32_t ui32Data)
{
//
//检查参数。
//
assert (_SSIBaseValid (ui32Base));
Assert (((ui32Data &(0xfffffffe <<)(HWREG (ui32Base + SSI_O_CR0)&
SSI_CR0_DSS_M))= 0);
//
//等待,直至有空格。
//
while (!(HWREG (ui32Base + SSI_O_SR)& SSI_SR_TNF))
{
}
//
//将数据写入 SSI。
//
HWREG (ui32Base + SSI_O_DR)= ui32Data;
}
*有关详细信息,请检查"driverlib/ssi.c"
此代码处于主模式且 UINT32数据类型->我想在从模式和浮点数据类型中使用 TM4C123
请建议进行必要的更改。 我已经尝试过一些类似的操作、如在上述函数的"driverlib/ssi.c"文件中手动更改数据类型。 但失败了
对于从机模式-我迄今没有尝试任何东西-但会
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_MASTER、1000000、 8);"
更改为
SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MOTO_0、SSI_MODE_SLAVE、1000000、 8);"
需要帮助吗?
