主题中讨论的其他部件: CC3200-LAUNCHXL, CC3200
工具/软件:Code Composer Studio
大家好,
我尝试从CC3200-LAUNCXL (主)向TMDSDOCK2.8335万 (从机)发送两个八位字符,同时从TMDSDOCK2.8335万向CC3200-LAUNCXL发送两个八位字符。 编写的代码将字符'A'和'B'从 CC3200-LAUNCHXL发送到 TMDSDOCK2.8335万,同时将'C'和'D'从 TMDSDOCK2.8335万发送到 CC3200-LAUNCHXL。 在下一次传输时,将发送相同的字符,但顺序相反('B'和'A'到TMDSDOCK2.8335万,'D'和'C'到CC3200-UNCLAHXL)。 基本上,在每次传输之前,字母都是互换的,但'A'和'B'总是从CC3200-LAUNCHXL转到 TMDSDOCK2.8335万,而'C'和'D' 总是从TMDSDOCK2.8335万 转到CC3200-LAUNCXL。
CC3200-LAUNCHXL每次都成功发送'A'和'B',因为我可以读取 TMDSDOCK2.8335万上的接收寄存器并验证它们是否正确。 但当我尝试从 TMDSDOCK2.8335万发送'C'和'D'到 CC3200-LAUNCHXL时,我总是得到'!','''或'.'。 因此,出于某种原因,在实际传输过程中,TMDSDOCK2.8335万上的传输寄存器的内容会发生变化。 是否有人知道问题可能是什么?
测试数据示例:
我尝试将一些十六进制值硬编码到 SpiaRegs.SPITXBUF中,这是通常发生的情况。 假设我有 此SpiaRegs.SPITXBUF = 0xB2E9设置(即0b1011.001万11101001)1110.1001万),那么我希望 CC3200-LAHXL端的接收寄存器具有 g_ucRxBuff[0]= 0b1110.1001万 (0xE9), 并且g_ucRxBuff[1]= 0b11.01万bf[0)= 0x1b1b1b1b1b1b1b1b0,而 不是0x1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b10.1001万b101001b1b1b1b1b1b0 (10.1001万 (0,而0xb1b1b1b 如果您获取 g_ucRxBuff[0]的MSB,并将其放在 g_ucRxBuff[1]的lsb (在这里它基本上成为lsb,但不替换原来的lsb)后面,并将 g_ucRxBuff[0]和 g_ucRxBuff[1]位值都移去一次, 然后得到正确的十六进制值(g_ucRxBuff[0]= 0xE9和 g_ucRxBuff[1]= 0xB2)。
CC3200-LAUNCHXL代码
//代码基于CC3200-LAUNCHXL主板随附的"SPI Demo" 。//标准包括 #include <string.h>// 驱动程序库包括 #include "HW_types.h" #include "HW_memmap.h" #include "HW_common_reg.h" #include "h_ints.h" #include "upuart.h/restru.h"#include "up.h" #uph/reuth" #include "uph.ro0" h/reuth.h"#include "uph.ro0" h/reuth"#include "uph/"uph/use" h 宏 #define spI_if_bit_rate 10万 //位/秒(bps) #define tr_buy_size 2//***** 全局变量的起点***** 静态无符号char g_ucTxBuff[TR_buff_size]; 静态无符号char g_ucRxBuff[TR_buff_size]; 静态无符号char ucTxVecBuffx; 静态无符号char ucRx***** Buffx; //不确定此内容在此处的作用,但随 附了#if defined(SPI) extrun void (* const_dief_enf/ vector)#defined vector 全局变量结束***** //***** 板初始化和配置启动***** (还随SPI演示提供) 静态void BoardInit(void) {/* 在TI-RTOS矢量表的情况下,由操作系统本身初始化*/ #ifndef use_TIRTOS //// 设置矢量表base // 如果定义(CCS) MAP_IntVTableBaseSet((unsigned long)&g_pfnvector[0]); #endif #if defined(ewarm) MAP_IntVTableBaseSet((unsigned Long)&__vector_table); #endif #endif // //启用处理器 // MAP_IntMasterEnable(); MAP_IntEnable (FAULT_Systick); PRCMCC3200MCUInit(); }//***** 板初始化和配置结束***** void main(){ //character generator variable char character1 ='A'; char character2 ='B'; //Initialize Board Configurations BoardInit(); //Muxing UART和SPI Lines //这是为MOSI,Miso,Chip Select和Clock配置引脚。 PinMuxConfig(); //启用SPI模块时钟 //启用外设时钟 //PRCM_GSPI = SPI外设的宏(0x0.0003万) //PRCM_run_mode_CLK =将时钟解关到外设(也可以是PRCM_SLP_MODE_CLK //使时钟保持休眠状态) MAP_PRCM_Peripheral_CLCM_CLCM_CLCM_CLK, 启用SPI_Peripheral_Mode //重置外设 //PRCM_GSPI = SPI外设的宏(重置SPI外设) MAP_PRCMalReset(PRCM_GSPI); //重置SPI //执行软件重置SPI模块 //GSPI_BASE = SPI基本地址的宏(0x4402.1万) MAP_SPIReset(GSPI_base); //配置SPI接口(所有值都是宏) //1st参数是SPI模块的基本地址(GSPI_BASE) //2nd参数是提供给SPI模块的时钟速率 //3rd参数是所需的比特率(在上面的“有用的宏”部分中定义) //4th参数是SPI_MODE_MASTER, 将主 板配置为master //5th参数的是SPI_SUB_MODE_0,它将时钟极性和相位设置为0//6th 参数是逻辑或组合的, 将芯片选择设置为由软件(SPI_SW_CTRL_CS)控制, //将模块设置为4引脚模式(SPI_4PIN_MODE),将Turbo模式设置为关闭(SPI_TURBO,我不知道什么是Turbo模式, //将芯片选择为低活动(SPI_CS_ACTIVELOW),并将位长度设置为16位, 或2个字符(SPI_WL_16) MAP_SPIConfigSetExpClk(GSPI_base, MAP_PRCMPeripheralClockGet(PRCM_Gcharacter),SPI_IF_bit_rate,SPI_MODE_MASTER, SPI_SUB_MODE_0, (SPI_SW_CTRL_CS| SPI_4PIN_MODE模式| SPI_SPI_SPI_SPI_POST_1; SPI_POX1; SPI_SPI_POX1; SPI_POST_E1; SPI_POX1; SPI_E1; SPI_POX1; SPI_POX1; SPI_POX1; SPI_POX1; SPI_POX1; SPI_POST_E1; SP1; SPI_E1; SPI_POX1; SPI_POX1; SP1; SP1; SP1; SPI_POX1; SPI_E1; SPI_POX1; SP1; //通过MOSI引脚发送字符 //1st参数是SPI模块(GSPI_base)的基本地址 //2nd参数指向传输缓冲区(g_ucTxBuff) //3rd参数指向接收缓冲区(g_ucRxBuff) //4th参数是以字节为单位的数据大小(1字节=8位) //5th参数是逻辑参数,或在传输前启用芯片选择引脚, //并禁用传输后的芯片选择引脚(SPI_CS_ENable|SPI_CS_disable) MAP_SPITransf(GSPI_base, g_ucTxBuff, g_ucRxBuff,2,SPI_CS_enable|SPI_enable); //Character generator if(spi_base_,g_stenditer,g_){1=1'1'2';{A}=1'){1'A=1'){1';{A}{A}{A=1'){A=1'1'){A=1';}{A=}{A=}{A=1}{A=1}{A{A}{A{
TMDSDOCK2.8335万代码
//基于TMS320F2.8335万 SPI示例 //器件头文件和示例的代码包括文件 #include "DSP28x_Project.h" //prototype语句,用于在此文件中找到的函数。 void spi_fifo_init(void); void spi_init(void); //全局变量(用于读取寄存器) unsigned char rdata1; unsigned char 'data2; unsigned char {'void';\'d' 主 控制: //PLL,看门狗,启用外设时钟 //此示例函数可在DSP2833x_sysctrl.c文件中找到。 InitSysCtrl(); //初始化GPIO: //此示例函数可在DSP2833x_GPIO.c文件中找到,并且 //说明了如何将GPIO设置为其默认状态。 //仅为SPI-A功能设置GP I/O //此函数位于DSP2833x_SPI.c InitSpiaGpio(); //清除所有中断并初始化PIE矢量表: //禁用CPU中断 DINT; //将PIE控制寄存器初始化到其默认状态。 //默认状态是禁用所有PIE中断并 清除标志//。 //此函数位于DSP2833x_PIECTRL.c文件中。 InitPieCtrl(); //禁用CPU中断并清除所有CPU中断标志: IER = 0x0000; IFR = 0x0000; //使用指向shell Interrupt // Service例程(ISR)的指针初始化PIE矢量表。 //这将填充整个表,即使在此 示例中未使用中断//。 这对于调试非常有用。 // shell ISR例程可在DSP2833x_DefaultIsr.C.中找到 //此函数位于DSP2833x_PieVect.C.中 InitPieVectorTable(); SPI_fifo_init();//初始化SPI SPI_init(); // init SPI //用户特定代码: //此示例中不使用中断。 for (;;) { //加载传输缓冲区 SpiaRegs.SPITXBUF = sdata[1]|(sdata[0]<<8); //字符生成器 IF (sdata[0]=67){sdata[0]='D';} else{sdata[0]='C';} IF (sdata[1]=68){sdata[1]='C';} else{sdata[1]='D';} //等待直到收到数据 while (SpiaRegs.SPIFFRX.bit.RXFFST !=1){} rdata1 = SpiaRegs.SPIRXBUF & 0xFF; rdata2 =(SpiaRegs.SPIRXBUF & 0xFF00)>> 8; } void SPI_init(){//SPICCR 是8位寄存器 //位7 (软件重置):设置为0,必须在配置 前清除//位6 (时钟极性):设置为0,在上升沿输出数据,输入 的位为下降位/保留位5 (边缘/输入): 不允许写入 //位4 (SPI环回):设置为0以禁用,仅用于内部测试 //位3-0 (字符长度位):设置为0b1111用于16位字符(CC3200发送两个字符,共16位) SpiaRegs.SPICCR.ALL =0x000F; //SPICCL是8位寄存器 //位7-5 (保留): 不允许写入 //位4 (启用溢出中断):暂时设置为0,只是尝试执行简单SPI连接 //位3 (时钟相位):设置为0,正常SPI时钟方案(不延迟半个周期) //位2 (主/从位): 设置为0作为从属 //位1 (通话位):设置为1,尝试将数据发回 //位0 (SPI中断启用):设置为0,现在不必担心中断 ,SpiaRegs.SPICTL.ALL =0x0002; //此寄存器无关紧要,因为时钟来自CC3200-LAUNCCHRR SpiaRegs.SPIBF; //SPICCR是一个8位寄存 器//位7 (软件重置):设置为1,必须在准备好进行数据传输 时设置//位6 (时钟极性):设置为0,数据输出在上升沿,数据输入在下降沿 //位5 (保留):不允许写入 //位4 (SPI环回): 设置为0可禁用,仅限内部测试 //位3-0 (字符长度位):设置为0b1111用于16位字符(CC3200发送两个字符,共16位) SpiaRegs.SPICCR.ALL =0x008F; //设置为使断点不干扰传输 SpiaRegs.SPIPRI.Bit.FREE = 1; } Spifvo_SPif.SPX.SPX.SPX.SPX.SPXf=SPIFFESTX.040f/ SPIf_EFI= 初始化传输 SpiaRegs.SPIFFCT.All=0x0; }