工具/软件: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;
}
//
//文件结束
//