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/TMS320F28069M:使用 F28069M 的 SPI 通信在没有中断的情况下不发送超过2个数据(int)

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/860370/ccs-tms320f28069m-spi-communication-using-f28069m-not-sending-more-than-2-data-int-without-interrupt

器件型号:TMS320F28069M

工具/软件:Code Composer Studio

尊敬的先生,

我正在尝试使用 SPI 通信在两个 F28069m Launchpad 之间进行通信、而不会中断一个是从器件、另一个是主器件。 但我无法发送和接收 两个以上的数据。

请帮我解决您的建议。

谢谢你。

我的主设备代码:

//######################################################################################################################
//
//文件:example_2806xSpi_FFDLB.c
//
//标题:SPI 数字回路示例
//
//! addtogroup f2806x_example_list
//!

SPI 数字回路(SPI_LOOP)


//!
//! 该程序使用外设的内部回路测试模式。
//! 而不是引导模式引脚配置、没有其他硬件配置
//! 要求。 不使用中断。
//!
//! 发送数据流、然后与接收到的数据流进行比较。
//! 发送的数据如下所示:\n
//! 0000 0001 0002 0003 0004 0005 0006 0007… FFFE FFFF \n
//! 这种模式会一直重复。
//!
//! b 监视\b 变量\n
//! -\b sdata,已发送数据
//! -/b RDATA,已接收数据
//
////######################################################################################################################
//$TI 发行版:F2806x 支持库 v2.04.00.00 $
//$Release Date:Thu OCT 18 15:47:20 CDT 2018 $
//版权所有:
//版权所有(C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//########################################################################################################################

//
//包含的文件
//
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include
#include
//
//函数原型
//
void SPI_xmit (uint16 a);
void SPI_Fifo_init (void);
void SPI_init (void);
void 错误(void);

//
//主函
//
void main (void)

uint16 sdata;//发送数据
uint16 RDATA;//接收的数据
uint16 rxdata;
uint16 tdata;
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
//InitGpio();//针对此示例跳过

//
//仅为 SPI-A 功能设置 GP I/O
//此函数位于 F2806x_SPI.c 中
//
InitSpiaGpio();

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
//
InitPieVectTable();

//
//步骤4. 初始化所有器件外设:
//此函数可在 F2806x_InitPeripherals.c 中找到
//
//InitPeripheral();//本示例不需要
SPI_Fifo_init();//初始化 SPI FIFO
SPI_init();// init SPI

//
//步骤5. 用户特定代码:
//此示例中不使用中断。
//
sdata = 0x0000;
uint16_t array1[10]={2412、2043、14、15、16、17、18、19、20、21};
uint16_t array2[10];
uint16_t i;
for (;;)

//
//发送数据
//
for (i=0;i<=8;i++)

SpiaRegs.SPICTL.bit.TALK = 1;
spi_xmit (array1[i]);
DELAY_US (100);
// SpiaRegs.SPITXBUF = 0;

for (i=0;i<=8;i++)

SpiaRegs.SPICTL.bit.TALK = 0;
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1);
array2[i]= SpiaRegs.SPIRXBUF;
DELAY_US (100);
// SpiaRegs.SPIRXBUF = 0;


//
//等待数据被接收
//

/* spi_xmit (tdata);

//
//检查已发送的数据
//
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1);
rxdata = SpiaRegs.SPIRXBUF;
*
sdata++;
tdata++;

//
//错误-步骤7。 插入所有本地中断服务例程(ISR)
//和函数
//
无效
错误(无效)

_asm (" ESTOP0");//测试失败!! 停下来!
适用于(;);

//
// SPI_init -
//
无效
SPI_INIT()

SpiaRegs.SPICCR.all =0x000F;//复位打开、上升沿、16位字符位
SpiaRegs.SPICCR.bit.SPICHAR = 2;
//
//启用主控模式、正常阶段、启用通话和禁用 SPI int。
//
SpiaRegs.SPICTL.ALL =0x0006;

SpiaRegs.SPIBRR = 0x007F;
SpiaRegs.SPICCR.all =0x009F;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点以避免干扰 xmission
SpiaRegs.SPICTL.bit.MASTER_SLAVE =1;

//
// SPI_xmit -
//
无效
SPI_Xmit (uint16 A)

SpiaRegs.SPITXBUF=A;

//
// SPI_Fifo_init -
//
无效
SPI_Fifo_init (空)

//
//初始化 SPI FIFO 寄存器
//
SpiaRegs.SPIFFTX.All=0xE040;
SpiaRegs.SPIFFRX.All=0x2044;
SpiaRegs.SPIFFCT.All=0x0;

//
//文件结束
//

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

和从器件//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//######################################################################################################################
//
//文件:example_2806xSpi_FFDLB.c
//
//标题:SPI 数字回路示例
//
//! addtogroup f2806x_example_list
//!

SPI 数字回路(SPI_LOOP)


//!
//! 该程序使用外设的内部回路测试模式。
//! 而不是引导模式引脚配置、没有其他硬件配置
//! 要求。 不使用中断。
//!
//! 发送数据流、然后与接收到的数据流进行比较。
//! 发送的数据如下所示:\n
//! 0000 0001 0002 0003 0004 0005 0006 0007… FFFE FFFF \n
//! 这种模式会一直重复。
//!
//! b 监视\b 变量\n
//! -\b sdata,已发送数据
//! -/b RDATA,已接收数据
//
////######################################################################################################################
//$TI 发行版:F2806x 支持库 v2.04.00.00 $
//$Release Date:Thu OCT 18 15:47:20 CDT 2018 $
//版权所有:
//版权所有(C) 2009-2018 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//########################################################################################################################

//
//包含的文件
//
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
#include
#include
//
//函数原型
//
void SPI_xmit (uint16 a);
void SPI_Fifo_init (void);
void SPI_init (void);
void 错误(void);

//
//主函
//
void main (void)

uint16 sdata;//发送数据
uint16 RDATA;//接收的数据

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
//InitGpio();//针对此示例跳过

//
//仅为 SPI-A 功能设置 GP I/O
//此函数位于 F2806x_SPI.c 中
//
InitSpiaGpio();

//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
//
InitPieVectTable();

//
//步骤4. 初始化所有器件外设:
//此函数可在 F2806x_InitPeripherals.c 中找到
//
//InitPeripheral();//本示例不需要
SPI_Fifo_init();//初始化 SPI FIFO
SPI_init();// init SPI

//
//步骤5. 用户特定代码:
//此示例中不使用中断。
//
sdata = 0x0000;
uint16_t i;
// uint16_t array_data[10]={1、2、3、4、5、6、7、8、9、10};
uint16_t array_data_1[100];
while (1)

//

//
for (i=0;i<=8;i++){
SpiaRegs.SPICTL.bit.TALK = 0;
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1){}
array_data_1[i]= SpiaRegs.SPIRXBUF;
DELAY_US (100);
// SpiaRegs.SPIRXBUF = 0;

for (i=0;i<=8;i++)

SpiaRegs.SPICTL.bit.TALK = 1;
SPI_xmit (array_data_1[i]);
DELAY_US (100);
// SpiaRegs.SPITXBUF = 0;

/* while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1){}
array_data_1[0]= SpiaRegs.SPIRXBUF;
DELAY_US (100);
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1){}
array_data_1[1]= SpiaRegs.SPIRXBUF;
DELAY_US (100);
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1){}
array_data_1[0]= SpiaRegs.SPIRXBUF;
DELAY_US (100);
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1){}
array_data_1[1]= SpiaRegs.SPIRXBUF;
DELAY_US (100);
for (i=0;i<=9;i++)

SPI_xmit (array_data_1[i]);
DELAY_US (100);
}*/
/*
for (i=0;i<=9;i++){
spi_xmit (array_data[i]);

//
//等待数据被接收
//
for (i=0;i<=9;i++)

while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1){}
array_data_1[i]= SpiaRegs.SPIRXBUF;

*

// if (RDATA!= sdata)
//{
// error();
//}

sdata++;

//
//错误-步骤7。 插入所有本地中断服务例程(ISR)
//和函数
//
无效
错误(无效)

_asm (" ESTOP0");//测试失败!! 停下来!
适用于(;);

//
// SPI_init -
//
无效
SPI_INIT()

SpiaRegs.SPICCR.all =0x000F;//复位打开、上升沿、16位字符位

//
//启用主控模式、正常阶段、启用通话和禁用 SPI int。
//
SpiaRegs.SPICTL.ALL =0x0006;

SpiaRegs.SPIBRR = 0x007F;
SpiaRegs.SPICCR.all =0x009F;//从复位中撤回 SPI
SpiaRegs.SPIPRI.bit.FREE = 1;//设置断点以避免干扰 xmission
SpiaRegs.SPICTL.bit.MASTER_SLAVE =0;

//
// SPI_xmit -
//
无效
SPI_Xmit (uint16 A)

// SpiaRegs.SPITXBUF=A;
SpiaRegs.SPITXBUF = A |(A<<8);

//
// SPI_Fifo_init -
//
无效
SPI_Fifo_init (空)

//
//初始化 SPI FIFO 寄存器
//
SpiaRegs.SPIFFTX.All=0xE040;
SpiaRegs.SPIFFRX.All=0x2044;
SpiaRegs.SPIFFCT.All=0x0;

//
//文件结束
//

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

    请使用语法突出显示器工具来格式化代码(它是" "按钮)。 在不使用格式化的情况下读取共享的代码是很困难的。

    我注意到、在尝试发送数据之前、您没有检查 FIFO 是否已满。 您添加的延迟可能足够长、足以确保发送、但检查 SPIFFTX.TXFFST 会更可靠。

    说 while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1)也可能会导致问题。 如果另一个字在读取前一个字之前到达、并且您的 RXFFST 设置为2或更高、该怎么办? 说 while (SpiaRegs.SPIFFRX.bit.RXFFST=0)可能更有意义。 这样、您只需读取、直至 FIFO 为空。

    此外、请记住、使用 SPI、每次发送数据时都会移入数据、因此即使接收到的数据并不有意义、也会填满 RXFIFO、因此您可能需要对 SPIRXBUF 执行一些虚拟读取操作来清除您不关心的数据。

    惠特尼

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

    您好、Whitney  

    我正根据您的建议进行尝试、我发现 SPI 现在无法接收和传输超过6字节的数据。

    这是我的新编辑

    主设备:

    e2e.ti.com/.../SPIA_5F0026005F00_SPIB_5F00_Master_5F00_slave_5F00_com_5F00_21_5F00_11_5F00_19_5F00_16_5F00_37.c

    从属方:e2e.ti.com/.../SPIA_5F00_slave_5F00_com_5F00_21_5F00_11_5F00_19_5F00_16_5F00_37.c

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

    从站侧代码仍然显示 while (SpiaRegs.SPIFFRX.bit.RXFFST!= 1)、而不是 while (SpiaRegs.SPIFFRX.bit.RXFFST=0)。

    哪个接收/发送不起作用? 您是否能够成功运行代码的主器件-发送/从器件-接收循环、但从器件-发送/主器件-接收循环失败、或者您在代码中还没有获得如此远的距离?

    您是否有逻辑分析仪、示波器或某些工具可用于观察信号传输、从而帮助您进行调试?

    惠特尼