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/TMS320C5535:使用 SPI 协议将 TMS320C5535与 ADXL345集成

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/756616/ccs-tms320c5535-intefacing-tms320c5535-with-adxl345-using-spi-protocol

器件型号:TMS320C5535

工具/软件:Code Composer Studio

您好!

 在继续之前有关使用 TMS320C5535和 ADXL345 ADC 的文章时、我在同一论坛和 eZdsp 下的示例文件夹中找到了 CSL_SPI.c 示例文件。  

 我已经在环回模式下测试了 TMS320C5535 eZdsp 电路板、它工作正常、

 使用 Arduino 板测试了 ADXL345、工作正常(获取正确的加速计数据)。

 但是、我发现当我在 SPI 接口中将 eZdsp 电路板与 ADXL345连接时、它只读取 FFFF、而不是读取 DR1寄存器中的实际数据

 请告诉我需要对以下源代码进行哪些更改

/ /

#include "stdio.h"
#include "cSL_spi.h"
#include "cSL_general.h"

//#define CSL_SPI_BUF_LEN (3)
#define CSL_SPI_BUF_LEN (2)
#define SPI_CLK_DIV (512)
//#define SPI_CLK_DIV (1638)
#define SPI_FRAME_LENGTH (1)
float x、y、z;
int x1、y1、z1;
int i、frame[];

UINT16 X0、X1、Y0、Y1、Z0、Z1;
uint16 OLED_TEST ();
uint16 spiWriteBuff[10];
uint16 spiReadBuff[10];
uint16 bufIndex=0;


CSL_Status SPI_initialize (void);
CSL_Status SPI_configure (CSL_SpiHandle hSpi、SPI_Config * spiHwConfig);
CSL_Status SPI_WRITE_ADC (CSL_SpiHandle hSpi、UINT16 *写入缓冲器、UINT16 bufLen);
CSL_Status SPI_READ_ADC (CSL_SpiHandle hSpi、UINT16 * readBuffer、UINT16 bufLen);
CSL_Status SPI_dataTransaction (CSL_SpiHandle hSpi、UINT16 * rwBuffer、UINT16 rwBufLen、SPI_Command readOrWrite);
CSL_SpiHandle SPI_open (SPI_HwMode csNum、SPI_OperMode opMode);

void main()


CSL_SpiHandle hSpi;
int16结果、延迟;
SPI_Config HwspiConfig;
易失性 uint32环回器;

结果= SPI_initialize();
if (CSL_Sok!=结果)

printf ("SPI 初始化失败!\n\n");

其他


printf ("SPI 初始化成功!\n\n");

HwConfig.spiClkDiv = SPI_CLK_DIV;
HwspiConfig.clkPh = SPI_CLK_PH_RISE_EDGE;
HwspiConfig.clkPol = SPI_CLKP_HIGH_AT 空闲;
HwspiConfig.csNum = SPI_CS_NUM_0;
HwspiConfig.csPol = SPI_CSP_ACTIVE_HIGH;
HwspiConfig.wLen = SPI_WORD_LENGTH_16;
spiHwConfig.frLen = SPI_FRAME_LENGTH;
HwspiConfig.dataDelay = SPI_DATA_DLY_0;
HwspiConfig.fcEnable = SPI_FRAME_IRQ_DISABLE;
HwspiConfig.wcEnable = SPI_WORD_IRQ_DISABLE;

//在 TMS320C5535中配置 SPI

结果= SPI_configure (hSpi、&spiHwConfig);

for (delay = 0;delay < 1000;delay++);

HwspiConfig.csPol = SPI_CSP_ACTIVE_LOW;
结果= SPI_configure (hSpi、&spiHwConfig);
if (CSL_Sok!=结果)

printf ("SPI 配置失败\n\n");

其他

printf ("SPI 已成功配置!\n\n");


//在 ADXL345 ADC 中配置 SPI
//设置电源控制字

//spiWriteBuff[0]= 0x002D;
//spiWriteBuff[1]=0x0000;
WritspieBuff[0]= 0x2D00;
结果= SPI_dataTransaction (hSpi、&spiWriteBuff[0]、CSL_SPI_BUF_LEN、SPI_WRITE);

if (CSL_Sok!=结果)

printf ("SPI 写入失败\n");
返回;

其他

printf ("SPI 写入成功\n");


//设置数据控制字:+/- 4g (ADXL345加速计的范围)
//spiWriteBuff[0]= 0x0031;
//spiWriteBuff[1]=0x0001;
WritspieBuff[0]= 0x3101;
结果= SPI_dataTransaction (hSpi、&spiWriteBuff[0]、CSL_SPI_BUF_LEN、SPI_WRITE);
if (CSL_Sok!=结果)

printf ("SPI 写入失败\n");
返回;

其他

printf ("SPI 写入成功\n");


//设置波特率:3200
//spiWriteBuff[0]= 0x002D;
//spiWriteBuff[1]=0x0016;
WritspieBuff[0]= 0x2D16;
结果= SPI_dataTransaction (hSpi、&spiWriteBuff[0]、CSL_SPI_BUF_LEN、SPI_WRITE);
if (CSL_Sok!=结果)

printf ("SPI 写入失败\n");
返回;

其他

printf ("SPI 写入成功\n");

//开始测量
//spiWriteBuff[0]= 0x002D;
//spiWriteBuff[1]=0x0008;
WritspieBuff[0]= 0x2D08;
结果= SPI_dataTransaction (hSpi、&spiWriteBuff[0]、CSL_SPI_BUF_LEN、SPI_WRITE);
if (CSL_Sok!=结果)

printf ("SPI 写入失败\n");
返回;

其他

printf ("SPI 写入成功\n");

for (delay = 0;delay < 1000;delay++);

//从 ADXL345加速计读取
while (1)

//将数据写入 SPI (ADXL345的 X0轴)
//spiWriteBuff[0]= 0x00B2;
//spiWriteBuff[1]=0x0000;
WritspieBuff[0]= 0xB200;
结果= SPI_dataTransaction (hSpi、&spiWriteBuff[0]、CSL_SPI_BUF_LEN、SPI_WRITE);
if (CSL_Sok!=结果)

返回;//(CSL_TEST_FAILED);

其他

printf ("SPI 实例写入成功\n"\n);

//将数据读取到 SPI
for (delay = 0;delay < 1000;delay++);
//最初将读取缓冲区设置为零
spiReadBuff[0]= 0x0000;
结果= SPI_dataTransaction (hSpi、&spiReadBuff[0]、CSL_SPI_BUF_LEN、SPI_Read);
if (CSL_Sok!=结果)

返回;//(CSL_TEST_FAILED);

其他

printf ("SPI 实例读取成功\n"\n);


printf ("X0=%i\n"、spiReadBuff[0]);

//对 ADXL345的其他轴重复此操作
//spiWriteBuff[0]= 0x0000;
//spiWriteBuff[1]=0x00B3;
SpiWriteBuff[0]= 0x00B3;// X1
结果= SPI_dataTransaction (hSpi、&spiWriteBuff[0]、CSL_SPI_BUF_LEN、SPI_WRITE);
if (CSL_Sok!=结果)

返回;//(CSL_TEST_FAILED);

其他

printf ("SPI 实例写入成功\n"\n);

//.........

结果= SPI_deInit();
if (CSL_Sok!=结果)

返回(CSL_TEST_FAILED);

其他

printf ("SPI 实例取消初始化成功\n"\n);

CSL_Status SPI_initialize (空)

易失性 uint16延迟;
ioport volatile CSL_SysRegs * sysRegs;

sysRegs =(CSL_SysRegs *) CSL_SYSCTRL_regs;
CSL_fins (sysRegs->PCGCR1、SYS_PCGCR1_SPICG、CSL_SYS_PCGCR1_SPICG_ACTIVE);

/*"重置计数器"的值*/
CSL_fins (sysRegs->PSRCR、SYS_PSRCR_COUNT、0x20);

CSL_fins (sysRegs->PRCR、SYS_PRCR_PG4_RST、CSL_SYS_PRCR_PG4_RST_RST);
for (delay = 0;delay < 100;delay++);

CSL_fins (sysRegs->EBSR、SYS_EBSR_PPMODE、CSL_SYS_EBSR_PPMODE_MODE5);

返回(CSL_SOK);

CSL_Status SPI_configure (CSL_SpiHandle hSpi、SPI_Config * SpiHwConfig)


Int16状态;
uint16 sysClkDiv、spicmd2;
易失性 uint16延迟;

状态= CSL_SOK;
if (NULL == hSpi)

返回(CSL_ESYS_BADHANDLE);

if (NULL =spiHwConfig)

返回(CSL_ESYS_INVPARAMS);

/*禁用串行数据时钟*/
CSL_FSET (CSL_SPI_regs->SPICCR、CSL_SPI_SPICCR_CLKEN_SHIFT、
CSL_SPI_SPICCR_CLKEN_SHIFT、CSL_SPI_SPICCR_CLKEN_DISABLED);
//CSL_FINST (CSL_SPI_regs->SPICCR、SPI_SPICCR_CLKEN、已禁用);
CSL_FINST (CSL_SPI_regs->SPICCR、SPI_SPICCR_RST、版本);

/*时钟分频必须为分频值或等于2 */
if (HwspiConfig->spiClkDiv > 2)

sysClkDiv = spiHwConfig->spiClkDiv - 1;

其他

sysClkDiv = 2;//默认时钟分频为2

/*设置时钟分频*/
CSL_fins (CSL_SPI_regs->SPICDR、SPI_SPICDR_CLKDV、sysClkDiv);

/*设置字长位0、1、2……… 31 */
spicmd2 = spiHwConfig->wLen <<CSL_SPI_SPICMD2_clen_shift;
//CSL_fins (CSL_SPI_regs->SPICMD2、SPI_SPICMD2_clen、spiHwConfig->wLen);

/*设置帧长度位0、1、2...... 4095 */
CSL_fins (CSL_SPI_regs->SPICMD1、SPI_SPICMD1_FLEN、spiHwConfig->frLen-1);

/*启用或禁用字计数 IRQ */
CSL_fins (CSL_SPI_regs->SPICMD1、SPI_SPICMD1_Cirq、spiHwConfig->wcEnable);

for (delay = 0;delay < 16;delay++);
/*启用串行数据时钟*/
CSL_SPI_regs->SPICCR =
(uint16)(CSL_SPI_SPICCR_CLKEN_ENABLED <<CSL_SPI_SPICCR_CLKEN_SHIFT);

/*启用或禁用帧计数 IRQ */
CSL_fins (CSL_SPI_regs->SPICMD1、SPI_SPICMD1_FIRQ、spiHwConfig->fcEnable);

/*选择活动 CS 进行传输*/
spicmd2 |= spiHwConfig->csNum << CSL_SPI_SPICMD2_CSNUM_SHIFT;
CSL_FSET (CSL_SPI_regs->SPICMD2、15、0、spicmd2);
// CSL_fins (CSL_SPI_regs->SPICMD2、SPI_SPICMD2_CSNUM、spiHwConfig->csNum);

/*根据芯片选择设置数据延迟、cs pol、clk pol 和 clpck pkase 位*/
交换机(HwspiConfig->csNum)

案例 CSL_SPI_SPICMD2_CSNUM_CS0:
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_DD0、
HwspiConfig->dataDelay);
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_CSP0、
HwspiConfig->csPol);
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_CKP0、
HwspiConfig->clkPol);
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_CKPH0、
HwspiConfig->clkPh);
中断;
案例 CSL_SPI_SPICMD2_CSNUM_CS1:
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_DD1、
HwspiConfig->dataDelay);
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_CSP1、
HwspiConfig->csPol);
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_CKP1、
HwspiConfig->clkPol);
CSL_fins (CSL_SPI_regs->SPIDCR1、SPI_SPIDCR1_CKPH1、
HwspiConfig->clkPh);

中断;
案例 CSL_SPI_SPICMD2_CSNUM_CS2:
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_DD2、
HwspiConfig->dataDelay);
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_CSP2、
HwspiConfig->csPol);
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_CKP2、
HwspiConfig->clkPol);
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_CKPH2、
HwspiConfig->clkPh);

中断;
案例 CSL_SPI_SPICMD2_CSNUM_CS3:
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_DD3、
HwspiConfig->dataDelay);
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_CSP3、
HwspiConfig->csPol);
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_CKP3、
HwspiConfig->clkPol);
CSL_fins (CSL_SPI_regs->SPIDCR2、SPI_SPIDCR2_CKPH3、
HwspiConfig->clkPh);
中断;
默认值:
状态= CSL_ESYS_INVPARAMS;

if (CSL_ESYS_INVPARAMS!=状态)
hSpi->Configured = true;
其他
hSpi->configured = false;
返回(状态);

CSL_Status SPI_deInit (空)

ioport volatile CSL_SysRegs * sysRegs;

if (true=spi_instance.configured)
spi_instance.configured = false;

sysRegs =(CSL_SysRegs *) CSL_SYSCTRL_regs;
//禁用 SPI 时钟
CSL_fins (sysRegs->PCGCR1、SYS_PCGCR1_SPICG、CSL_SYS_PCGCR1_SPICG_DISABLED);
返回(CSL_SOK);

CSL_Status SPI_WRITE_ADC (CSL_SpiHandle hSpi、UINT16 *写入缓冲器、UINT16 bufLen)

uint16 getWLen;
易失性 uint16 bufIndex;
uint16 spiStatusReg;
易失性 uint16 spiBusyStatus;
易失性 uint16 spiWcStatus;
易失性 uint16延迟;

bufIndex = 0;
if ((NULL =writeBuffer)||(0 ==bufLen))

返回(CSL_ESYS_INVPARAMS);

/*读取寄存器中的字长*/
getWLen = CSL_FEXT (CSL_SPI_regs->SPICMD2、SPI_SPICMD2_clen)+ 1;

if (getWLen > SPI_MAX_WORD_LEN)

返回(CSL_ESYS_INVPARAMS);

/*写入用户设置的字长*/
while (bufIndex < bufLen)

/*写入寄存器的字长超过16位*/
if (getWLen == 16)

CSL_SPI_regs->SPIDR2 = writeBuffer[bufIndex];
CSL_SPI_regs->SPIDR1 = 0x0000;
bufIndex ++;

/*写入小于或等于16位字长度的寄存器*/
否则、如果(getWLen == 8)

CSL_SPI_regs->SPIDR2 =(UINT16)(writeBuffer[bufIndex]<< 0x08);
CSL_SPI_regs->SPIDR1 = 0x0000;
bufIndex++;

//设置写入寄存器的命令*/
CSL_fins (CSL_SPI_regs->SPICMD2、SPI_SPICMD2_CMD、SPI_WRITE_CMD);

//for (延迟= 0;延迟< 1000;延迟++);

操作

spiStatusReg = CSL_SPI_regs->SPISTAT1;
spiBusyStatus =(spiStatusReg 和 CSL_SPI_SPISTAT1_BSY_MASK);
spiWcStatus =(spiStatusReg & CSL_SPI_SPISTAT1_CC_MASK);
}while (((spiBusyStatus == CSL_SPI_SPISTAT1_BSY_BUSY)&&
(spiWcStatus!= CSL_SPI_SPISTAT1_CC_MASK);

返回(CSL_SOK);

CSL_Status SPI_READ_ADC (CSL_SpiHandle hSpi、UINT16 *读取缓冲器、UINT16 bufLen)

int16 getWLen;
易失性 uint16 bufIndex;
Int16 spiStatusReg;
volatile Int16 spiBusyStatus;
volatile Int16 spiWcStatus;
易失性 uint16延迟;

bufIndex = 0;
if ((NULL == readBuffer)||(0 == bufLen))

返回(CSL_ESYS_INVPARAMS);

/*读取寄存器中的字长*/
getWLen = CSL_FEXT (CSL_SPI_regs->SPICMD2、SPI_SPICMD2_clen)+ 1;

if (getWLen >= SPI_MAX_WORD_LEN)

返回(CSL_ESYS_INVPARAMS);

/*读取用户设置的字长*/
while (bufIndex < bufLen)

/*用于读取缓冲区的 set 命令*/
CSL_fins (CSL_SPI_regs->SPICMD2、SPI_SPICMD2_CMD、CSL_SPI_SPICMD2_CMD_READ);

// for (delay = 0;delay < 1000;delay++);

操作

spiStatusReg = CSL_SPI_regs->SPISTAT1;
spiBusyStatus =(spiStatusReg 和 CSL_SPI_SPISTAT1_BSY_MASK);
spiWcStatus =(spiStatusReg & CSL_SPI_SPISTAT1_CC_MASK);

while ((spiBusyStatus = CSL_SPI_SPISTAT1_BSY_BUSY)&&
(spiWcStatus!= CSL_SPI_SPISTAT1_CC_MASK);

if (getWLen == 16)

readBuffer[bufIndex]= CSL_SPI_regs->SPIDR1;
readBuffer[bufIndex+1]='\0';
bufIndex++;

否则、如果(getWLen == 8)

readBuffer[bufIndex]=(CSL_SPI_regs->SPIDR1和0xFF);
bufIndex++;


返回(CSL_SOK);


CSL_Status SPI_dataTransaction (CSL_SpiHandle hSpi、UINT16 * rwBuffer、UINT16 rwBufLen、SPI_Command readOrWrite)

CSL_Status 状态;
if (NULL == hSpi)
返回(CSL_ESYS_BADHANDLE);
if ((NULL =rwBuffer)||(0=rwBufLen))
返回(CSL_ESYS_INVPARAMS);
if (false =hSpi->已配置)
返回(CSL_ESYS_INVPARAMS);
//从寄存器读取数据
if (SPI_READ_CMD = readOrWrite)
状态= SPI_READ_ADC (hSpi、rwBuffer、rwBufLen);
//将数据写入寄存器
否则、如果(SPI_WRITE_CMD = readOrWrite)
状态= SPI_WRITE_ADC (hSpi、rwBuffer、rwBufLen);
其他
状态= CSL_ESYS_INVPARAMS;

返回(状态);

/ /

  请帮助我解决此问题。

提前感谢

此致

库萨

   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我不是一个硬件人员。
    如何为 SPI 总线供电?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Tom:

    感谢您的快速回复。
    就电源和上拉 SPI 总线而言、这是在 SPI 初始化期间完成的、这是按照 TMS320C5535技术参考手册中提到的过程完成的。 是否有任何其他方式为 SPI 总线供电、请告诉我
    提前感谢您

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

    库萨、
    请检查您的原理图。
    您的 eZdsp 是否为所选 SPI 提供上拉电阻器和电源?