请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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; }