主题中讨论的其他部件: 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;
}