主题中讨论的其他器件: C2000WARE
您好!
我正在尝试通过 SPI 将数据从主设备传输到从设备。 主从均为 TMS320F28335、但有2个差分板。 在进行传输时、我无法接收数据。 它从 TXBUF 发送到数据寄存器、但在该 RXBUF 之后没有接收数据。 有人能帮助我吗?
该主模式
#include "Mcu1_Device.h"// DSP2833x 头文件包含文件
#include "Mcu1_spi.h"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
//
// InitSPI -此函数将 SPI 初始化为已知状态。
//
UNS16数据= 0x5555;
UNS16 receivedData;//=0;
UNS16 transdata =0、Dataregister = 0;
空 InitSpi (空)
{
//
//初始化 SPI-A/B/C/D
//
}
//
// InitSpiGpio -该函数初始化 GPIO 引脚以用作 SPI 引脚
//
//每个 GPIO 引脚都可以配置为一个 GPIO 引脚,或者配置为3个不同的
//外设功能引脚。 默认情况下、所有引脚都作为 GPIO 出现、
//复位后输入。
//
//注意:
//针对每个 SPI 外设
//只应启用一个 GPIO 引脚进行 SPISOMO 操作。
//只应启用一个 GPIO 引脚来进行 SPISOMI 操作。
//只应启用一个 GPIO 引脚来运行 SPICLKA。
//对于 SPISTEA 操作,只应启用一个 GPIO 引脚。
//注释掉其他不需要的行。
//
void InitSpiGpio()
{
InitSpiaGpio();
}
//
// InitSpiaGpio -此函数初始化 GPIO 点以用作 SPI 引脚
//
void InitSpiaGpio()
{
EALLOW;
//
//启用所选引脚的内部上拉
//上拉可由用户启用或禁用。
//这将启用指定引脚的上拉。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAPUD.bit.GPIO16 = 1;//启用 GPIO16上的上拉(SPISIMOA)
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 1;//启用 GPIO17上的上拉(SPISOMIA)
GpioCtrlRegs.GPAPUD.bit.GPIO18 = 1;//启用 GPIO18上的上拉(SPICLKA)
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 1;//启用 GPIO19上的上拉(SPISTEA)
// GpioCtrlRegs.GPBPUD.bit.GPIO54 = 0;//启用 GPIO54上的上拉(SPISIMOA)
// GpioCtrlRegs.GPBPUD.bit.GPIO55 = 0;//启用 GPIO55上的上拉(SPISOMIA)
// GpioCtrlRegs.GPBPUD.bit.GPIO56 = 0;//启用 GPIO56上的上拉(SPICLKA)
// GpioCtrlRegs.GPBPUD.bit.GPIO57 = 0;//启用 GPIO57上的上拉(SPISTEA)
//
//将所选引脚的鉴定设置为仅异步
//这将为所选的引脚选择异步(无限定条件)。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;//异步输入 GPIO16 (SPISIMOA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;//异步输入 GPIO17 (SPISOMIA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;//异步输入 GPIO18 (SPICLKA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;//异步输入 GPIO19 (SPISTEA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO54 = 3;//异步输入 GPIO16 (SPISIMOA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO55 = 3;//异步输入 GPIO17 (SPISOMIA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO56 = 3;//异步输入 GPIO18 (SPICLKA)
//GpioCtrlRegs.GPBQSEL2.bit.GPIO57 = 3;//异步输入 GPIO19 (SPISTEA)
//
//使用 GPIO 寄存器配置 SPI-A 引脚
//这指定了可能的 GPIO 引脚中的哪一个是 SPI
//功能引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;//将 GPIO16配置为 SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//将 GPIO17配置为 SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;//将 GPIO18配置为 SPICLKA
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1;//将 GPIO19配置为 SPISTEA
// GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 1;//将 GPIO54配置为 SPISIMOA
// GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 1;//将 GPIO55配置为 SPISOMIA
// GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 1;//将 GPIO56配置为 SPICLKA
// GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 1;//将 GPIO57配置为 SPISTEA
EDIS;
}
void init_spi ()//function for config GPIO 和 SCI 模块
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;//启用外设时钟
EDIS;
//配置 SPI 模块
SpiaRegs.SPICCR.all = 0x002F;
// SpiaRegs.SPICTL.bit.SPIINTENA =1;
SpiaRegs.SPICTL.bit.talk = 1;//作为主模式、 需要通话
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;//作为主模式,使其为1
SpiaRegs.SPIBRR = BRR;
SpiaRegs.SPIFFTX.bit.TXFFIL = 2;//8;
SpiaRegs.SPIFFTX.bit.TXFFIENA = 1;
SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
SpiaRegs.SPIFFTX.bit.SPIFFENA = 1;
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
// SpiaRegs.SPIFFRX.ALL = 0x2062;//8;
EALLOW;
//配置中断
PieVectTable.SPITXINTA =&SPI_TX_ISR;//将 ISR 分配给 SCI TX 中断
// PieVectTable.SPIRXINTA =&SPI_RX_ISR;//将 ISR 分配给 SCI RX 中断
//外设初始化
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
pieCtrlRegs.PIEIER6.bit.intx2 = 1;//此处在 PIE 组中启用 SCI RX 中断9 //429 intr
PieCtrlRegs.PIEIER6.bit.INTx1 = 1;//此处启用 PIE 组中的 SCI TX 中断9
//这是禁用对 EALLOW 保护寄存器的写入所必需的
EDIS;
// IER |= 0x0020;//或 M_INT6;
EINT;//启用中断
ERTM;//启用全局实时中断 DBGM
printf ("传输\n");
}
void SPI_TX (void)
{
// if (SpiaRegs.SPISTS.bit.INT_flag!= 1)//检查 TX 已为数据做好准备
if (SpiaRegs.SPIFFTX.bit.TXFFST == 0)//TX 为空且为新数据做好准备
{
printf ("ready to transfer\n");//打印 TX 状态
SpiaRegs.SPITXBUF =数据;
//}//通过 SCI-A 发送数据
}
否则
{
printf ("发送器未就绪");
}
transdata = SpiaRegs.SPITXBUF;//读取从 SCITXBUF 传输的数据
printf ("发送器数据:0x%X\n"、transdata);
Dataregister= SpiaRegs.SPIDAT;
printf ("寄存器中的数据是:0x%X\n"、Dataregister);
}
用于发送中断的//ISR
中断失效 SPI_TX_ISR ()
{
//清除中断标志
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
//确认该中断以接收来自组9的更多中断
PieCtrlRegs.PIEACK.all |= PIEACK_group6;
}
这是从模式
void init_spi ()//function for config GPIO 和 SCI 模块
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;//启用外设时钟
EDIS;
//配置 SPI 模块
SpiaRegs.SPICCR.all = 0x002F;
// SpiaRegs.SPICTL.bit.SPIINTENA =1;
SpiaRegs.SPICTL.bit.talk = 0;//作为受控模式、无需通话
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;//作为从模式使其为0
SpiaRegs.SPIBRR = BRR;
SpiaRegs.SPIFFRX.all = 0x2062; //8;
EALLOW;
//配置中断
PieVectTable.SPIRXINTA =&SPI_RX_ISR;//将 ISR 分配给 SCI RX 中断
//外设初始化
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//启用 PIE 块
pieCtrlRegs.PIEIER6.bit.intx2 = 1;//此处在 PIE 组中启用 SCI RX 中断9 //429 intr
// PieCtrlRegs.PIEIER6.bit.INTx1 = 1;//此处启用 PIE 组9中的 SCI TX 中断
//这是禁用对 EALLOW 保护寄存器的写入所必需的
EDIS;
// IER |= 0x0020;//或 M_INT6;
EINT;//启用中断
ERTM;//启用全局实时中断 DBGM
printf ("传输\n");
}
void SPI_Rx (void)
{
UNS16 START_TIME = CLOCK ();
printf("ready to receive\n");
receivedData = SpiaRegs.SPIRXBUF;//Anil //读取接收到的数据
printf ("receivedData:0x%X\n"、receivedData);
}
//ISR 用于接收中断
中断失效 SPI_RX_ISR ()
{
//清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
// SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;//清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;//清除中断标志
//确认该中断以接收来自组9的更多中断
PieCtrlRegs.PIEACK.all |= PIEACK_group6;//确认中断以清除标志
}
在 main.c 中调用 TX 和 RX 函数并在 main.c 中全局提供数据
此外、我还可以告诉我两个目标、我需要从哪个引脚连接到哪个引脚、例如 SIMO 到 SOMI 或 SIMO 到 SIMO 和 SOMI 到 SOMI。 是否连接了该 SPICLKA 引脚、它是否仅将 CLKA 连接至 CLKA?由于我只有一个从器件 、因此我需要将 SPISTEA 引脚从主器件连接至从器件。
您能尽快帮我吗?
谢谢。此致、
查亚

