Thread 中讨论的其他器件:C2000WARE
工具与软件:
我 将尝试 在28379D 之间执行双向通信、一个作为主器件、另一个作为从器件。
我已成功执行单向通信(主器件->传输、从器件->接收器)
但是、当我尝试进行双向通信时、我遇到了问题。
主器件和从器件有时都会收到正确值、有时会收到错误值。 错误的值是我尝试发送的值或一些随机值。
用于主设备的代码
#include "F28x_Project.h"
void delay_loop (void);
void spi_xmit (uint16A);
void spi_fifo_init (void);
void SPI_init (void);
void 错误(void);
Volatile Uint16 datasend=40;
void main (void)
{
uint16 sdata;
UINT16 RDATA;
InitSysCtrl();
InitSpiaGpio();
颜色;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init ();
InitSpi();
SData = 1;
for (;;)
{
//发送数据
spi_xmit (datasend);
DELAY_US (100);
if (SpiaRegs.SPIFFRX.bit.RXFFST!= 0){
RDATA = SpiaRegs。 SPIRXBUF;//读取接收到的数据
}
}
}
void delay_loop()
{
长 I;
对于(i = 0;i < 10000;i++){}
}
void 错误(void)
{
asm (" ESTOP0");
(;;);
}
void spi_xmit (uint16A)
{
SpiaRegs。 SPITXBUF = A;
}
void spi_fifo_init ()
{
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFIENA = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINT = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFST = 0x00;
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0x00;
SpiaRegs.SPIFFCT.all=0x0;
}
#include "F2837xD_DEVICE.h"
#include "F2837xD_examples.h"
//
//计算 BRR:7位波特率寄存器的值
// SPI CLK freq = 500kHz
// LSPCLK freq = CPU freq/4 (默认设置)
// BRR =(LSPCLK freq / SPI CLK freq)- 1
//
#if CPU_FRQ_200MHz
#define SPI_BRR ((200E6 / 4)/ 500E3)- 1
#endif
#if CPU_FRQ_150MHz
#define SPI_BRR ((150E6 / 4)/ 500E3)- 1
#endif
#if CPU_FRQ_120MHz
#define SPI_BRR ((120E6 / 4)/ 500E3)- 1
#endif
//
// InitSPI -此函数将 SPI 初始化为已知状态
//
void InitSpi (void)
{
//初始化 SPI-A
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpiaRegs.SPICCR.bit.SPICHAR =(16-1);
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
SpiaRegs.SPICTL.bit.talk = 1;
SpiaRegs.SPICTL.bit.SPIINTENA = 1;// Enable SPIINTENA to Generate INT_FLAG bit on complete SPI transmission (启用 SPIINTENA 以在 SPI 传输完成时生成 INT_FLAG 位)
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
//
void InitSpiGpio()
{
InitSpiaGpio();
}
//
// InitSpiaGpio -初始化 SPIA GPIO
//
void InitSpiaGpio()
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 GPIO16上的上拉(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO19 (SPISTEA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO19 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//将 GPIO19配置为 SPISTEA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO19配置为 SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//将 GPIO19配置为 SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//将 GPIO19配置为 SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3;//将 GPIO19配置为 SPISTEA
EDIS;
}
//
//文件结尾
//
生成中断
#include "F28x_Project.h"
void delay_loop (void);
void spi_xmit (uint16A);
void spi_fifo_init (void);
void SPI_init (void);
void 错误(void);
Volatile Uint16 datasend = 450;//发送数据
uINT16 RDATA;//接收到的数据
void main (void)
{
InitSysCtrl();
InitSpiaGpio();
颜色;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
spi_fifo_init ();//初始化 SPI FIFO
InitSpi();
for (;;)
{
spi_xmit (datasend);//发送数据
DELAY_US (100);
if (SpiaRegs.SPIFFRX.bit.RXFFST!= 0){
RDATA = SpiaRegs。 SPIRXBUF;//读取接收到的数据以清除 RX FIFO
}
}
}
void 错误(void)
{
asm (" ESTOP0");//测试失败!! 停下来!
(;;);
}
void spi_xmit (uint16A)
{
// while (SpiaRegs.SPIFFTX.bit.TXFFST >= 16){}//如果 TX FIFO 已满、则等待
SpiaRegs。 SPITXBUF = A;
}
void spi_fifo_init ()
{
SpiaRegs.SPIFFRX.bit.RXFFIL = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFIENA = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFINT = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFST = 0x00;
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 0x00;
SpiaRegs.SPIFFRX.bit.RXFFOVF = 0x00;
SpiaRegs.SPIFFCT.all=0x0;
}
#include "F2837xD_DEVICE.h"
#include "F2837xD_examples.h"
//
//计算 BRR:7位波特率寄存器的值
// SPI CLK freq = 500kHz
// LSPCLK freq = CPU freq/4 (默认设置)
// BRR =(LSPCLK freq / SPI CLK freq)- 1
//
#if CPU_FRQ_200MHz
#define SPI_BRR ((200E6 / 4)/ 500E3)- 1
#endif
#if CPU_FRQ_150MHz
#define SPI_BRR ((150E6 / 4)/ 500E3)- 1
#endif
#if CPU_FRQ_120MHz
#define SPI_BRR ((120E6 / 4)/ 500E3)- 1
#endif
//
// InitSPI -此函数将 SPI 初始化为已知状态
//
void InitSpi (void)
{
//初始化 SPI-A
SpiaRegs.SPICCR.bit.SPISWRESET = 0;
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 1;
SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = SPI_BRR;
SpiaRegs.SPICCR.bit.SPICHAR =(16-1);
SpiaRegs.SPIFFTX.bit.SPIFFENA = 0;
SpiaRegs.SPICTL.bit.talk = 1;// Receiver mode enabled (SpiaRegs.SPICTL.bit.talk = 1)
SpiaRegs.SPICTL.bit.SPIINTENA = 1;
SpiaRegs.SPICCR.bit.SPILBK = 0;
SpiaRegs.SPICCR.bit.SPISWRESET = 1;
}
void InitSpiGpio()
{
InitSpiaGpio();
}
//
// InitSpiaGpio -初始化 SPIA GPIO
//
void InitSpiaGpio()
{
EALLOW;
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0;//启用 GPIO58上的上拉(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 0;//启用 GPIO59上拉(SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60 = 0;//启用 GPIO60上的上拉(SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 0;// Enable pio61 (SPISTEA)上拉
GpioCtrlRegs.GPBQSEL2.bit.GPIO58 = 3;//异步输入 GPIO58 (SPISIMOA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO59 = 3;//异步输入 GPIO59 (SPISOMIA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO60 = 3;//异步输入 GPIO60 (SPICLKA)
GpioCtrlRegs.GPBQSEL2.bit.GPIO61 = 3;//异步输入 GPIO61 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 3;//将 GPIO58配置为 SPISIMOA
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 3;//将 GPIO59配置为 SPISOMIA
GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 3;//将 GPIO60配置为 SPICLKA
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 3;//将 GPIO61配置为 SPISTEA
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 3;//将 GPIO58配置为 SPISIMOA
GpioCtrlRegs.GPBGMUX2.bit.GPIO59 = 3;//将 GPIO59配置为 SPISOMIA
GpioCtrlRegs.GPBGMUX2.bit.GPIO60 = 3;//将 GPIO60配置为 SPICLKA
GpioCtrlRegs.GPBGMUX2.bit.GPIO61 = 3;//将 GPIO61配置为 SPISTEA
EDIS;
}
//
//文件结尾
//
示波器数据
黄色:MOSI
粉色:时钟选择
蓝色:MISO
MOSI 的数据似乎大多是正确的、但在 MISO 中、错误更多。
有人可以帮我解决这个问题吗?
我曾尝试使用 FIFO、但在这种情况下、从器件似乎卡住了。



