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.
工具/软件: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;
返回(状态);
}
/ /
请帮助我解决此问题。
提前感谢
此致
库萨
库萨、
请检查您的原理图。
您的 eZdsp 是否为所选 SPI 提供上拉电阻器和电源?