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.

[参考译文] CCS/TMDSDOCK2.8335万:TMDSDOCK2.8335万/CC3200-LAUNCHXL之间3200之间的SPI连接

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/584449/ccs-tmdsdock28335-spi-connection-between-tmdsdock28335-cc3200-launchxl

部件号:TMDSDOCK2.8335万
主题中讨论的其他部件: CC3200-LAUNCHXLCC3200

工具/软件: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;
} 

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

    您是否尝试使用示波器并查看了正在传输的数据? 如果你转移数据,你的数据将是正确的,所以我想知道在这个转移过程中的某个地方是否出现了问题。

    您也可以尝试仅发送一个字节,并查看CC3200端收到的内容。

    请告诉我您的发现,

    Vince Rodriguez
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试一次发送一个字节,结果发现同样的事情也在发生。 虽然它不能解决问题,但我确实提出了一个"快速解决"的解决方案,它还没有让我失望。

    unsigned int char_array_to_int =(g_ucRxBuff[1]<8)|(g_ucRxBuff[0]& 0xFF);
    unsigned int store_msb =(char_array_to_int >> 15)和0x0001;
    unsigned int keep bits_except _lsb (char_array_to_int <1)和0xFFFE;
    unsigned int correct_integer = keee_bits_except _lsb|store_msb;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dalen,

    您是否检查了时钟上升或下降边缘的数据? 我将检查并确保CC3200是C2000的两款都相同。


    虚拟现实
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正在上升沿检查数据,是的,CC3200和C2000具有相同的时钟极性和相位,即0。

    自从发布此代码后,我确实做了更改。 现在,单词长度为8 (SPI_WL_8),问题仍然存在。 我读取的最后一个十六进制值是0x7F77,上面写的代码为我提供了0xEEFE。 所以我翻转了lsb,它给了我0xEEFF,这就是我所寻找的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没关系,翻动lsb不起作用。 以下是更多数据值(如果有用):
    我应该收到什么 我实际收到的内容 使用我上面写的“快速修复”代码
    0x0011 0x0080 0x0010
    0xAAAA 0x5555 0xAAAA
    0x5555 0xAA2A 0x5554
    0xFFFF 0xFF7F 0xFFFE
    0x0000 0x0000 0x0000
    0xABCD 0xE655 0xABCC
    0x274E 0xA713 0x274E
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉,我尝试创建三列,以在"我应该接收的内容","我实际接收的内容"和"使用上面我编写的"快速修复"代码下显示数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可能会发现问题。

    在C2000代码中,将SPICCR寄存器更改为:

    SpiaRegs.SPICCR.ALL =0x000E;

    或者,您可以使用以下行设置SPICHAR值:

    SpibRegs.SPICCR.bit.SPICHAR = 15;//16位字符

    设置SPICHAR时,必须执行所需的字符数-1。

    请告诉我这是否有帮助!

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

    非常感谢您的帮助。 遗憾的是,它没有解决问题。 我们可以继续并关闭此线程,因为我想用另一个线程中的最新代码更新该问题。