This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C123GH6PM:SPI 通信(浮点数据类型)从器件配置

Guru**** 2457760 points
Other Parts Discussed in Thread: EK-TM4C123GXL, TM4C123GH6PM, TMS320F28377D

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/642556/ccs-tm4c123gh6pm-spi-communication-float-datatype-slave-configuration

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123EK-TM4C123GXLTMS320F28377D

工具/软件: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);"

需要帮助吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    至于"必要"-您的从器件 SPI 配置必须与您(外部) SPI"主器件"的配置正确匹配。   "SPI 主设备"是"您的老板"(抱歉让他人进行分类)并控制数据传输。  

    事实证明、从属模式非常复杂、您的"启动" w/浮动可能会导致(至少会增加)您的(潜在)疼痛/痛苦。

    朋友“吻”——总是和唯一的——指导“一次打斗”——目标是“最小、最简单、最专注/可衡量”的目标。 通过系统的"细化块"进行-每个块都实现了目标"里程碑"-而不是通过(始终是一厢情愿)"巨型沟!"进行

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您没有提到它是如何失败的、因此以下是我在尝试编译您发布的第一个代码时看到的问题。

    首先、您需要包含用于定义您用作 TivaWare 库一部分的常量的头文件。 我添加了以下#includes:

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    

    接下来,函数 SSIDataPut ()上出现错误,因为第二个参数现在是 float 而不是无符号整数。 最简单的解决方案(但出于许多原因不是最佳解决方案)是将浮点值转换为整数。 然后该行如下所示:

    SSIDataPut (SSI0_BASE、(uint32_t) pui32DataTx[ui32Index]>>(i*8);
    

    最后、您注释掉了平衡代码所需的其中一个括号。 我只是通过删除"\\"来更正它。

    现在、我为什么说这可能不是最佳解决方案。 首先、这仅起作用、因为在本例中、浮点值的大小与无符号整数的大小(32位)相同。 其次、许多编码标准都强烈劝阻铸造、因为这会导致混淆、进而导致编码错误。 其他解决方案包括使用 void 指针或使用联合数组。 如果您只是从 C 编码开始、这些可能是您不熟悉的主题。 有许多经验丰富的 C 编码器负责监控此论坛、他们可能会就如何编写此程序提供更好的建议、从而使其易于阅读和理解。 (阅读和理解越容易、出错的可能性就越小。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好  和  

    [引用 user="Bob Crosby"]

    首先,您需要包括头文件...:

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    

    [/报价]

    是的、很显然、我在我的程序中包含了头文件、只是在这里没有。 这些也是我在我的中添加的内容。 无论如何,感谢您提供其他海报,但这些海报可能会在本帖子中出现:)

    [引用 user="Bob Crosby"]

    SSIDataPut (SSI0_BASE、(uint32_t) pui32DataTx[ui32Index]>>(i*8);

    [/报价]

    是的、我尝试过这种方法、但这对小数点不起作用。 我要对此 SPI 使用浮点的主要动机是、我(可能)在数组中有符号十进制数。 我尝试对这些值进行拼写错误、但它没有解决问题

    [引用 user="Bob Crosby"]

    这仅起作用、因为在这种情况下、浮点值的大小与无符号整数32位的大小相同。

    [/报价]

    哦、抱歉、如果我之前没有清除"pui32DataTx"数组中的4个数字只是用于试验的"虚拟"数字。 此处通信所需的 SPI 实际上需要一个浮点数据类型、而不是"UINT32"或"int"。 我可以理解,我在提到问题说明时可能错过了这一点。 :D  

     

    [引用 USER="CB1_MOBILE"]

    至于"必要"-您的从器件 SPI 配置必须与您(外部) SPI"主器件"的配置正确匹配。

    [/报价]

    是的、我理解。 我特意将 tm4c 配置为从设备、将 uC 配置为主设备。

    [引用 USER="CB1_MOBILE"]

    事实证明、从属模式非常复杂、您的"启动" w/浮动可能会导致(至少会增加)您的(潜在)疼痛/痛苦。

    [/报价]

    是的,从我在这个论坛上的时间开始--我肯定学到的一件事是遵循 kiss;D

    因此、首先、我想解决最简单的问题-"只需在 MCU 之间完成 SPI 即可"

    已在 TIVAware 中显示共享的 SSI 示例-仅发送 uint32数据类型。

    现在、我想改进它以浮点数据类型。 完成后、我希望在从模式下进行相同的配置。

    我希望这就是我应该继续的方式。 您是否知道如何解决此问题-发送浮点数据类型而不是 uint32?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    转换(uint32_t)适用于小数。  您收到了什么错误信息? 以下是使用浮点数数组进行编译时无误的示例。

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    
    float pui32DataTx[4]={3.143.159、i327.75
    }、float rx 3.375[3.375]3.0、i3.0、i3.0、iPu327.75、iuatu.h
    uint32_t ui32Index;
    int i;
    
    
    int
    main (void)
    {
    
    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    //必须启用 SSI0外设才能使用。
    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);
    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);
    SSIEnable (SSI0_BASE);
    //
    //发送 n 个字节的数据。
    //
    for (ui32Index = 0;ui32Index < 4;ui32Index++)
    {
    
    for (i=0;i<4;i++)
    {
    //
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    //
    SSIDataPut (SSI0_BASE、(uint32_t) pui32DataTx[ui32Index]>>(i*8);
    
    //
    //等待 SSI0完成传输发送 FIFO 中的所有数据。
    //
    while (SSIBusy (SSI0_BASE));
    }
    }
    
    while (1);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好  

    我刚刚复制了您的代码片段、并在 SSIDataPut 之前添加了此行

    temp[(ui32Index*4)+i]=(uint32_t) pui32DataTx[ui32Index]>>(i*8);
    SSIDataPut (SSI0_BASE、temp[(ui32Index*4)+i]);
    

    这将显示在每次迭代中传输的 uint 数据。

    正如您在下图中看到的-只有整数部分正在进行通信

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Rohan Chahwan">我正在尝试(希望)   通过 SPI 通信发送浮点数据类型数组。 [/报价]

    一般而言、这是一个非常糟糕的想法。 发送浮点二进制文件很少是个好主意。 存在太多不同的格式和异常。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Rohan Chahwan"]

    我刚刚复制了您的代码片段、并在 SSIDataPut 之前添加了此行

    temp[(ui32Index*4)+i]=(uint32_t) pui32DataTx[ui32Index]>>(i*8);
    SSIDataPut (SSI0_BASE、temp[(ui32Index*4)+i]);
    

    这将显示在每次迭代中传输的 uint 数据。

    正如您在下图中看到的-只有整数部分正在进行通信

    [/报价]

    您刚刚将结果转换为整数、您还会期待什么呢?

    您不希望仅更改指针的类型、而是更改底层类型。

    Robert

    和 TI? 这是一个很好的示例、说明了为什么将 uint32_t 用作一切的基本类型是一个不好的主意。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert Adsett (3681028)

    我在互联网上发现 float 具有[符号|Exponent|尾数]、但我不确定它在哪些地方对于特定的 uC 保持不变/不变(我的猜测-应该是)

    我很感谢您提出这一点、即在 SPI 上发送浮点是一个非常糟糕的主意、但遗憾的是、我在一些计算之后一直使用浮点阵列、我想在某个位置进行通信。 什么是浮点二进制文件-我不知道[我将在 google 上查找]如果您要共享、请执行此操作。 )

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Rohan Chahwan"]我在互联网上发现 float 具有[符号|Exponent|尾数],但我不确定它在哪些地方保持特定 uC 的恒定/不变(我的猜测-应该是)[/quote

    也许对于单个微/编译器、但假设您保持这种组合是一个飞跃

    我已经看到了十几个或更多的内部浮点格式变化、而这不是一个问题、即存在多少 Nan 和什么类型的 Nan、必须如何处理它们或如何处理非规范化浮点。

    [引用 user="Rohan Chahwan"]不幸的是,在进行一些计算后,我一直使用浮点数组[/引用]

    为什么? 我已经使用了许多 SCADA/工业设置、这些设置必须传达非整数值。 它们中没有一个使用浮点来执行此操作。 实际上、在浮点是有用甚至必要的通信格式的情况下、很难最终解决这一问题。 尤其是、整数表示对于相同的位数必然具有更高的精度。

    [引用 user="Rohan Chahwan"]什么是浮点二进制文件-我不知道

    注意尝试重新措辞,这样做是有道理的? ;)

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    注意尝试重新措辞,这样做是有道理的? ;)

    [\quot]

    哎呀、我读错了。 :D:D:D 我的坏

    无论如何... 我已经尝试过这样的方法、可以发送几个字节、但之后它在这两者之间跳过几个字节...

    unsigned char * send8Bit

    send8Bit =&float_start

    对于(I=1至4)

    TX *send8BIT++;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    应该注意的是、海报的 SPI 实施是"SPI 从属设备"的实施、因此早期的(响应者)代码:

    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);

    不太可能满足海报的(从属)要求。

    应该注意的是、长期以来(并将继续)人们都很清楚 地认识到没有"MCU 作为 SPI 从站示例!"   (确实证明对这里的许多人很有用、尤其是供应商员工 (世卫组织-减去示例-必须从零开始(重复))...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要做的是获取浮点数、将其视为无符号整数(因为 SSIDataPut 和 SSIDataGet 函数需要无符号整数)、然后将整数分解为 SSI 的字节。 接收时、您需要反转该过程。 如果您只使用 EK-TM4C123GXL 板上的跳线连接 GPIO_PA4_SSI0RX 和 GPIO_PA5_SSI0TX、并运行此简单代码、则它将发送和读取包含四个浮点数的数组。

    #include 
    #include 
    #include "inc/hw_types.h"
    #include "inc/hw_memmap.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    #include "driverlib/ssi.h"
    #include "driverlib/pin_map.h"
    
    float pf32DataTx[4]={3.14375]3.0
    、p3.375[3.375]float rx、p327.375]+pfu.h
    
    
    int
    main (void)
    {
    uint32_t * pui32DataTx、* pui32DataRx、ui32Data;
    uint32_t i、ui32Index;
    
    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    //必须启用 SSI0外设才能使用。
    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);
    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_MASTER、1000000、8);
    SSIEnable (SSI0_BASE);
    
    //使用 unsigned int 指针指向浮点数组
    pui32DataTx =(uint32_t *) pf32DataTx;
    pui32DataRx =(uint32_t *) pf32DataRx;
    //
    //发送 n 个字节的数据。
    //
    for (ui32Index = 0;ui32Index < 4;ui32Index++)
    {
    pui32DataRx[ui32Index]= 0U;
    for (i = 0;i < sizeof (float);i++)
    {
    //
    //使用“阻塞”Put 函数发送数据。 此函数
    //将等待发送 FIFO 中有空间后再返回。
    //这使您可以确保发送的所有数据都将其输入
    //发送 FIFO。
    //
    SSIDataPut (SSI0_BASE、pui32DataTx[ui32Index]>>>(i*8u);
    SSIDataGet (SSI0_BASE、\ui32Data);
    pui32DataRx[ui32Index]|=(ui32Data <<(i*8u));
    }
    }
    
    while (1);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bob Crosby"]

    如果您只使用 EK-TM4C123GXL  板上的跳线连接 GPIO_PA4_SSI0RX 和 GPIO_PA5_SSI0TX、并运行此简单代码、则它将发送和读取包含四个浮点数的数组

    [/报价]
    嘿 Bob、这可能是一种很好的方法(我没有尝试过)、但您能解释一下为什么我应该将 TX 和 RX 连接在一起? 我的意思是、我将通过它实现什么?  
    @所有、  
    好的、我可能在这里玩的有点暗、没有详细解释整个要求、"就像我现在所感受到的"
    那么、它在这里
    我使用的是2块板、一个 TM4C123GH6PM (用于项目特定部分的 Tiva 板、并将数据发送到 C2000 MCU)和 TMS320F28377D (已经在执行我正在处理的项目的主要部分的 C2000 MCU)。
    我想在这两者之间进行通信、但--在下面的配置中  
    TMS320F28377D-主器件,也是因为它已经处理 SPI 从器件
    TM4C123GH6PM -从器件,它将是 SPI 通信中的数据发送器。
     
    现在、

    我想我已经回答了"这个孩子要做什么?"的问题、我不能吗?
    我知道可能还有其他方法可以做到这一点(也可以通过我的电子邮件 P 分享)、但我现在更喜欢 SPI 通信。
     我了解了您尝试解决问题的方法、即定义一个指针、然后使用该指针获取8个位置... 这与我在前一篇文章中所做的不一样吗? 它在工作原理上有何不同?
    如果它不同、那么它是否解决了我之前在映像中发布的问题(在这两者之间跳过了一些字节)... 请告诉我,它将非常有帮助:)
    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为了保护供应商的 Bob -不应该"您"投入所需的时间/精力来"测试 Bob 的建议代码?"   您必须预测这类需求对熟练(但时间有限)的供应商员工产生的"明显和不必要的影响"。   (因此不会拒绝或延迟其他论坛用户、"熟练的供应商服务"。)

    通过(您的)努力-您(恰当的)"跟进"问题是否会证明"您更容易进一步检查-获得见解-从而实现自我解决?"   (或引导您提出更多探究性/影响性问题和/或问题...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Rohan Chahwan"]我使用的是2块电路板、一个 TM4C123GH6PM (用于项目特定部分的 Tiva 板并将数据发送到 C2000 MCU)和个 TMS320F28377D (已经在执行我正在处理的项目的主要部分的 C2000 MCU)。

    您将来回发送二进制浮点!?

    您是否已验证(逐位)它们使用相同的表示形式? DSP 拥有自己的浮点表示法的情况并不少见。

    我个人甚至不会尝试它。 你当然没有为为什么它必须是浮点提供任何理由。

    [引用用户="Rohan Chahwan"]Hey Bob、这可能是一种很好的方法(我没有尝试过)、但您能解释一下为什么我应该将 TX 和 RX 连接在一起? 我的意思是、我将通过它实现什么?  [/报价]

    验证您的操作?

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Rohan、
    我的建议只是一种简单的方法来演示成功编译而没有错误的代码、在 SPI 上传输浮点数组、并在另一端显示如何重新汇编它们 此示例中不会丢失任何数据。 我意识到、在您的应用中、一个处理器将传输浮点数、另一个处理器将接收浮点数。

    我们是否已经回答了有关通过 SPI 传输和接收浮点数的原始问题? 如果是这样、我们应该关闭此线程并为丢失的数据启动一个新的线程。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Bob、

    是的 、正确的做法是、通过 SPI 传输和接收浮点值是"解决的"(我想说不是一个好主意、 因为只有我能够  正确地发送和接收4个字节、但 C2000微控制器上的浮点数重建无法解决)

    但是、我仍然保持此线程处于打开状态、因为标题为"从配置"的器件仍然存在。

    您(或其他任何人)能否帮助我将 TM4C 配置为从器件? 然后我将关闭这个线程

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    从配置的更改很简单。 只需将第32行中的"主设备"更改为"从属设备"。

    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、SSI_FRF_MOTO_MODE_0、
    SSI_MODE_SLAVE、1000000、8);
    

    您应该考虑一些事项。 首先、从器件必须首先运行、以便在主器件开始第一次传输之前其发送缓冲器准备就绪。

    第二个是该程序将在函数SSIDataGet()中挂起,等待第一个传输。 如果这是不可接受的、那么更复杂的例程可以加载 TX 缓冲区的 FIFO、并使用中断来清空 RX 缓冲区并重新加载 TX 缓冲区。