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.
我大家 都对 F28379D 上主模式和从模式的 SPI 有疑问。
我已经开始面临 F28379D 上的 SPIA RXBuffer 问题。
我无法接收数据。
任何人都可以帮助解决问题。
/*
* main.c
*
*创建日期:2021年9月28日
*作者:Devilal
*
#include
#include
#include
#include
#include "F28x_Project.h"
#include "F2837xD_DEVICE.h"
#include "F2837xD_examples.h"
#include "device.h"
#include "driverlib.h"
#define empty_loop
#define buffer_size 128
void configGPIO (void);
void initSPIBMaster (void);
void initSPIASlave (void);
_interrupt void spibTxFIFOISR (void);
_interrupt void spiaRxFIFOISR (void);
void SPI_TX_Byte (uint16_t a);
void SPI_TX_Strg_a (char * tx_str、uint16_t size);
void SPI_TX_Strg_B (char * tx_str、uint16_t size);
void 错误(void);
uint16_t sdata = 0;
char data[]="Enter Data\r\n";
uint16_t RDATA[15];//接收数据缓冲器
uint16_t rDataPoint = 0;
char rdataA[buffer_size];//针对 SCI-A 接收到的数据
uint16 RDATA_pointA;//用于检查接收到的数据
void main (void)
{
device_init();
DEVICE_initGPIO();
interrupt_initModule();//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
interrupt_initVectorTable();//使用指向 shell 中断服务例程(ISR)的指针初始化 PIE 矢量表。
IER = 0x0000;
IFR = 0x0000;
interrupt_register (INT_SPIB_TX、&spibTxFIFOISR);
interrupt_register (INT_SPIA_RX、&spiaRxFIFOISR);
//为外部回送配置 GPIO。
configGPIOs();
//将 SPI B 设置为主器件,将其初始化为 FIFO 模式
initSPIBMaster();
//将 SPI A 设置为从器件,将其初始化为 FIFO 模式
initSPIASlave();
//启用此示例所需的中断
INTERRUPT_ENABLE (INT_SPIA_RX);
INTERRUPT_ENABLE (INT_SPIB_TX);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
//启用全局中断(INTM)和实时中断(DBGM)
// EINT;
// ERTM;
while (1)
{
asm (" NOP");
// SPI_TX_Byte (sdata);
// sdata++;
// device_delay_US (10000);
}
}
void configGPIO (void)
{
/*
*-外部连接:
*-GPIO58和 GPIO63 - SPI-MOSI
*-GPIO59和 GPIO64 - SPI-MISO
*-GPIO61和 GPIO65 - SPI-STE
*-GPIO60和 GPIO66 - SPI-CLK
*
*
/* SPI-A 配置*/
/* GPIO59是 SPI-MISO。 *
GPIO_setMasterCore (59、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_59_SPISOMIA);
GPIO_setPadConfig (59、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (59、GPIO_QUAL_ASYNCx);
/* GPIO58是 SPI-MOSI 时钟引脚。 *
GPIO_setMasterCore (58、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_58_SPISIMOA);
GPIO_setPadConfig (58、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (58、GPIO_QUAL_异 步);
/* GPIO61是 SPI-STEA。 *
GPIO_setMasterCore (61、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_61_SPISTEA);
GPIO_setPadConfig (61、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (61、GPIO_QUAL_ASYNCO);
/* GPIO60是 SPI-CLKA。 *
GPIO_setMasterCore (60、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_60_SPICLKA);
GPIO_setPadConfig (60、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (60、GPIO_QUAL_异 步);
/* SPI-B 配置*/
/* GPIO64是 SPI-SOMIB。 *
GPIO_setMasterCore (64、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_64_SPISOMIB);
GPIO_setPadConfig (64、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (64、GPIO_QUAL_异 步);
/* GPIO63是 SPISIMOB 时钟引脚。 *
GPIO_setMasterCore (63、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_63_SPISIMOB);
GPIO_setPadConfig (63、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (63、GPIO_QUAL_异 步);
/* GPIO65是 SPICLKB。 *
GPIO_setMasterCore (65、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_65_SPICLKB);
GPIO_setPadConfig (65、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (65、GPIO_QUAL_异 步);
/* GPIO66是 SPISTEB。 *
GPIO_setMasterCore (66、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_66_SPISTEB);
GPIO_setPadConfig (66、GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode (66、GPIO_QUAL_异 步);
}
空 initSPIBMaster (空)
{
//必须在配置 SPI 之前将其复位
SPI_disableModule (SPIB_BASE);
// SPI 配置。 使用500kHz SPICLK 和16位字大小。
SPI_setConfig (SPIB_BASE、DEVICE_LSPCLK_FREQ
、SPI_PROT_POL0PHA0 //时钟极性和相位*/
、SPI_MODE_MASTER /* Master */
50、500000 //速度250K */
,16);/* 16个数据片段*/
SPI_disableLoopback (SPIB_BASE);
SPI_setEmulationMode (SPIB_BASE、SPI_emulation_free_run);
// FIFO 和中断配置
SPI_enableFIFO (SPIB_BASE);
SPI_clearInterruptStatus (SPIB_BASE、SPI_INT_TXFF);
SPI_setFIFOInterruptLevel (SPIB_BASE、SPI_FIFO_TX10、SPI_FIFO_RX10);
SPI_enableInterrupt (SPIB_BASE、SPI_INT_TXFF);
//配置完成。 启用模块。
SPI_enableModule (SPIB_BASE);
}
//
//功能将 SPI A 配置为启用 FIFO 的从器件。
//
空 initSPIASlave (空)
{
//必须在配置 SPI 之前将其复位
SPI_disableModule (SPIA_BASE);
// SPI 配置。 使用250kHz SPICLK 和16位字大小。
SPI_setConfig (SPIA_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、
SPI_MODE_SLAVE、50000、16);
SPI_disableLoopback (SPIA_BASE);
SPI_setEmulationMode (SPIA_BASE、SPI_emulation_free_run);
// FIFO 和中断配置
SPI_enableFIFO (SPIA_BASE);
SPI_clearInterruptStatus (SPIA_BASE、SPI_INT_RXFF);
SPI_setFIFOInterruptLevel (SPIA_BASE、SPI_FIFO_TX10、SPI_FIFO_RX10);
SPI_enableInterrupt (SPIA_BASE、SPI_INT_RXFF);
//配置完成。 启用模块。
SPI_enableModule (SPIA_BASE);
}
//
// SPI A 发送 FIFO ISR
//
_interrupt void spibTxFIFOISR (void)
{
// SPI_TX_Byte (sdata);
SPI_TX_Strg_B (data、sizeof (data));
//清除中断标志并发出 ACK
SPI_clearInterruptStatus (SPIB_BASE、SPI_INT_TXFF);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group6);
}
//
// SPI B 接收 FIFO ISR
//
_interrupt void spiaRxFIFOISR (void)
{
while (SpiaRegs.SPIFFRX.bit.RXFFST!= 0)
{
RDATA[rDataPoint]= SpiaRegs.SPIRXBUF;
rDataPoint++;
}
rDataPoint =0;
//清除中断标志并发出 ACK
SPI_clearInterruptStatus (SPIA_BASE、SPI_INT_RXFF);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group6);
Example_PassCount++;
}
空错误(空)
{
// asm (" ESTOP0");//测试失败!!! 停下来!
适用于(;);
}
void SPI_TX_Byte (uint16_t a)
{
IF (SpiaRegs.SPIFFTX.bit.TXFFST < 16)
{
SpiaRegs.SPITXBUF = A;
}
}
void SPI_TX_Strg_A (char * TX_str、uint16_t 大小)
{
uint16_t ch;
uint16_t temp=0;
while (<size)
{
CH =* Tx_str;
SpiaRegs.SPITXBUF=ch;
IF (SpiaRegs.SPIFFTX.bit.TXFFST < 16)
// while (SpiaRegs.SPIFFTX.bit.TXFFST < 16)
{
empty_loop;
}
TX_STR++;
}
}
void SPI_TX_Strg_B (char * TX_str、uint16_t 大小)
{
uint16_t ch;
uint16_t temp=0;
while (<size)
{
CH =* Tx_str;
SpibRegs.SPITXBUF=通道;
IF (SpibRegs.SPIFFTX.bit.TXFFST < 16)
// while (SpiaRegs.SPIFFTX.bit.TXFFST = 0)
{
empty_loop;
}
TX_STR++;
}
}
您好!
您的项目中是否包含"_LAUNCHXL_F28379D"预定义? 如果没有、您可以右键单击工程并转到属性、然后将其添加到"预定义符号"中。
是否有方法可以对 Launchpad 上的信号进行范围控制以确保数据传输到 RX 引脚?
此外、您能否检查是否曾经输入过 RX 中断? 标准 SPI C2000Ware 示例是否适合您、如外部环回示例?
此致、
Marlyn