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.

[参考译文] TMDSDOCK28335:将工作中的 SPI 代码和工作中的 SCI/UART (发送到 LabView)代码集成在一起。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/587734/tmdsdock28335-integrating-working-spi-code-and-working-sci-uart-sending-to-labview-code-together

器件型号:TMDSDOCK28335
Thread 中讨论的其他器件: CC3200

大家好、

我对 TMDSDOCK28335上的 SPI 有疑问。 我正在尝试使用 SPI 从 CC3200向 TMDSDOCK28335发送数据。 目前情况良好。 问题是尝试将 SPI 代码与 SCI/UART LabView 代码集成。 我们有用于 SPI 的工作代码、我们还有用于在 LabView 上显示读取值的工作代码。 但是、正如我说过的、当我们尝试将这两段代码组合在一起时、LabView 和 LabView 上的任何显示都不会在未收到任何数据10秒后超时。 这里是代码、因此您可以看到我拥有的代码。

注意:我没有尝试添加任何实际的 SPI 代码。 我添加的唯一内容是 SPI 配置调用函数(InitSpiaGpio())和设置 SPI 寄存器的两个函数调用(SPI_init()和 SPI_fifo_init())。 因此、有人告诉我、SPI 寄存器配置在某种程度上干扰了 TMDSDOCK28335上已经存在的 LabView 代码。

感谢您的帮助、

Dalen M.

#include "stdio.h"
#include "string.h"
#include "DSP28x_Project.h"

#if (CPU_FRQ_150MHz)
#define ADC_MODCLK 0x3
#endif

(CPU_FRQ_100MHz)
#define ADC_MODCLK 0x2
#endif

#define ADC_CLKPS #define




----#define ADC_0x256----#define ADC-0x/256----#define
void scia_echoback_init (void);
void scia_fifo_init (void);
void scia_xmit (int a);
void scia_msg (char * msg);
__interrupt void rxinta_isr (void);
_interrupt void ADC_ISR (void);
void SPI_Fifo_init (void);
void SPI_init (void);
//---global variables---------------------------------------------------
//--SCIA 变量-------------------------------------------------------
char msg[128];
char rxbuf[BUFSIZE];
uint16 bufi = 0;
int slen;
int debug;
//char* testBuffer;
//ADC 全局
uint16 output_voltage;
float test_analog_voltage;

unsigned int int1 = 16;
unsigned int int2 = 2568;
unsigned int int3 = 52258;unsigned





char int8 char inte2[test8;unsigned char inta] char inte2][test2]8 char inta]

char test4[8];

//---main 程序-------------------------------------------------------
int main (void){

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

EALLOW;
SysCtrlRegs.HISPCP。all = ADC_MODCLK;
EDIS;
//步骤2。 初始化所有相关的 GPIO 引脚
InitSciaGpio();
InitSpiaGpio();

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

//将 PIE 控制寄存器初始化为默认状态。
InitPieCtrl();

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

//使用指向 shell 中断
//服务例程(service routinese, ISR)的指针初始化 PIE 矢量表。
InitPieVectTable();

SPI_Fifo_init ();//初始化 SPI FIFO
SPI_init (); //初始化 SPI

EALLOW;//这是写入 EALLOW 受保护寄存
器 PieVectTable.SCIRXINTA =&rxinta_ISR;
PieVectTable.ADCINT =&ADC_ISR;
EDIS;//这是禁用写入 EALLOW 受保护寄存器

所必需的//步骤4。 初始化所有设备外设:
scia_echoback_init ();//初始化 SCI 以实现 echoback
scia_fifo_init ();//初始化 SCI FIFO
InitAdc ();
//步骤5。 特定于用户的代码、启用中断:
memset (rxbuf、0xFF、BUFSIZE);//清除缓冲区中的所有 Null 以方便字符串检查
memset (rxbuf + BUFSIZE -1、'\0'、1);//Tack a null on the end to facilen //

启用连接到 SCIA INT 的 CPU INT9:
PieCtrlRegs.PIEIER9.ALL = 0x0001;//启用所有 SCIA RXINT 中断
IER |= 0x0100;//启用 PIEIER9和 INT9

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//在 PIE 中启用 ADCINT
PieCtrlRegs.PIEIER1.bit.INTx6=1;
IER |= M_INT1;//启用 CPU 中断1
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM


//配置 ADC
// AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CLKPS;
// AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK;

AdcRegs.ADCMAXCONV.ALL = 0x0001;//设置 ADCCR1.Q1
= ADCRE1.SE1.Q1

位 ADC1.Q1 = ADCRE1.ADC1.SE1.Q1 = ADC1.SEV1.ADC1.Q1;ADC1.ADC1.ADC1.SEV1.ADCL.Q1 = ADC1.ADC1.ADC1.ADC1.ADC1.SE1.ADC1.ADC1.ADC1.ADC1.SE1.ADC1.Q1 = ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.V1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.ADC1.//从 ePWM 启用 SOCA 以启动 SEQ1
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1 intterupt (每个 EOS)

EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4; //从 CPMA 上数选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x0080;
// EPwm1Regs.CMPA.half.CMPA = 0x00;//设置比较值
EPwm1Regs.TBPRD = 1499; //为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并开始

(;)
{
sprintf (msg、"%08u"、INT1);
sprintf (test2、"%08u"、 int2);
sprintf (test3、"%08u"、int3);
sprintf (test4、 "%08u"、int4);

strcat (msg、test2);
strcat (msg、 test3);
strcat (msg、test4);

slen = strlen (rxbuf);
if (slen < BUFSIZE - 1)
{
if (strcmp ("data"、rxbuf)= 0)
{


scia_msg (msg);
debug = debug +1;
}
else{
scia_msg ("nooo")、

rxbuf)= 0);set = cia_msg (xmembff);set (0xcusf);
bufi = 0;
}
delay_US (100);
}


void scia_echoback_init ()
{
//注意:SCIA 外设的时钟被打开
//在 InitSysCtrl()函数中

SciaRegs.SCICCR.all =0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式、空闲线协议
SciaRegs.SCICTL1.all =0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、SLEEP、TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICT2.bit.TXINTENA=1;//已在上述语句
//SciaRegs.SCICT2.bit.RXBKINTENA=1;
#if (CPU_FRQ_150MHz)
SciaRegs.SCIHBAUD = 0x0000;// 173611波特@LSPCLK = 37.5MHz?
SciaRegs.SCILBAUD = 0x0028;//
#endif
#if (CPU_FRQ_100MHz)
SciaRegs.SCIHBAUD = 0x0000;// 9600 baud @LSPCLK = 20MHz。
SciaRegs.SCILBAUD = 0x001A;
#endif
SciaRegs.SCICTL1.all = 0x0023;//从复位中放弃 SCI

}

//从 SCI
void scia_xmit (int a)
{发送字符
while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){}
SciaRegs.SCITXBUF=a;
}

void scia_msg (char * msg)
{
int i;
I = 0;
while (msg[i]!='\0')
{
scia_xmit (msg[i]);
i++;
}
}

//初始化 SCI FIFO
void scia_fifo_init()
{
SciaRegs.SCIFFTX.All=0xE040;
SciaRegs.SCIFFRX.All=0x2061;
SciaRegs.SCIFFCT.ALL=0x0;
}


//此中断将从硬件缓冲区接收到的字符卸载到主文件
__interrupt void rxinta_isr ()
{
if (SciaRegs.SCIFFRX.bit.RXFFOVF)
{中分配的软件缓冲区 rxbuf
scia_msg ("FIFO_overflow!");

}
while (sciaRegs.SCIFFRX.bit.RXFFST!= 0){
if (bufi < BUFSIZE){
rxbuf[bufi++]= SciaRegs.SCIRXBUF.ALL;
}
thelse{
bufi = 0;
}aCRESCR=0






= 0;}nvoid = tid_transl_transle.ture_translr = 1/ translation_translation_reffeADC3.3/translr
= nature/output_true/void = d/ translr = t.intrue/ansc/an.transceCR3.3/transc/void = t_transl_translr = nature_translr = nature_translr = nature_translr = nature_transl
//reinit 开始
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//重置 SEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//清除 INT SEQ1位
PieCtrlRegs.PIEACK.ALL = PIEACK_Group1;//确认 intterupy



(void)/SPI reend 初始化

//SPICCR 是一个8位寄存器
//bit 7 (软件复位):设为0、必须在配置前清零
//位6 (时钟极性):设置为0、在上升沿输出数据、输入数据为下降沿
//位5 (保留):不允许写入
//位4 (SPI 环回):设置为0以禁用、仅用于内部测试
//位3-0 (字符长度位):对于16位字符、设置为0b1111 (CC3200发送两个字符、总共16位)
SpiaRegs.SPICCR.all =0x000F;

//SPICTL 是一个8位寄存器
//bit 7-5 (保留):不允许写入
//位4 (溢出中断使能):暂时设置为0,只是尝试进行简单的 SPI 连接
//位3 (时钟相位):设置为0、正常 SPI 时钟方案(不被延迟半个周期)
//位2 (主/从位):设置为0作为从器件
//bit 1 (TALK 位):设为1、尝试发回数据
//位0 (SPI 中断使能):设置为0,现在不用担心中断
SpiaRegs.SPICTL.ALL =0x0002;

//由于时钟来自 CC3200-LAUNCHXL、因此该寄存器无关紧要
SpiaRegs.SPIBRR = 0x007F;

//SPICCR 是一个8位寄存器
//位7 (软件复位):设置为1,当为数据传输做好准备时必须置位
//位6 (时钟极性):设置为0、在上升沿输出数据、输入数据为下降沿
//位5 (保留):不允许写入
//位4 (SPI 环回):设置为0以禁用、仅用于内部测试
//位3-0 (字符长度位):对于16位字符、设置为0b1111 (CC3200发送两个字符、总共16位)
SpiaRegs.SPICCR.all =0x008F;

//设置断点以使断点不会干扰传输
SpiaRegs.SPIPRI.bit.FREE = 1;
}

void SPI_Fifo_init (){

//初始化 SPI FIFO 寄存器(不确定这些寄存器的功能、只需默认保留它们)
SpiaRegs.SPIFFTX.All=0xE040;
SpiaRegs.SPIFFRX.All=0x204f;
SpiaRegs.SPIFFCT.ALL=0x0;
}

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

    您曾尝试过哪些方法来解决此问题? SPI 和 SCI 是完全不同的模块、它们之间没有任何相关性。

    LabView 正在等待时、MCU 上是否有任何活动? 您可以在这段时间内暂停 CPU 并观察执行的位置吗?
    如果您获取发送的代码并仅注释掉 SPI 初始化、它是否"修复"了问题?