TI中文支持网
TI专业的中文技术问题搜集分享网站

CC3220SF写SPI程序调试

Other Parts Discussed in Thread:CC3220SF

如果能够实现正常通信,用示波器看MOSI的信号和SCLK的信号应该是什么样的?为什么我的SCLK信号没有波形呢?

跟SPI时钟有关的程序在什么位置?

Susan Yang:

SDK内是有对应的例程的,您可以参考一下

examples\rtos\CC3220SF_LAUNCHXL\drivers\spimaster spislave

请问您现在使用的软硬件是怎样的?请您详细说明一下,谢谢

,

user6390304:

我使用的是T买的板卡与自己设计的ADC硬件进行SPI通信,因为采集不到数据,想要进行调试,用示波器查看sclk和输出是都正常,发现SCLK采集不到波形,软件上的程序使用的是官网上的例程改写的

,

Susan Yang:

请您给出ADC的型号,相关的配置代码,示波器显示的波形

我们根据您的详细信息具体看一下

另外E2E上有一些相关帖子,您可以先看一下

e2e.ti.com/…/cc3220sf-launchxl-data-received-over-spi-incorrecly-read

,

user6390304:

ADC型号为AD7124-8,具体使用,首先在SPI线程进行初始化
void *threadFxn0(void *arg0)
{
SPI_HandlemasterSpi;SPI_ParamsspiParams;
struct ad7124_device ad7124;SPI_Params_init(&spiParams);spiParams.frameFormat = SPI_POL1_PHA1;spiParams.bitRate = 1000000;masterSpi = SPI_open(CONFIG_SPI_MASTER, &spiParams);if (masterSpi == NULL) {Display_printf(display, 0, 0, "Error initializing master SPI\n");
while (1);}else {Display_printf(display, 0, 0, "Master SPI initialized\n");}AD7124_Setup(&ad7124, AD7124_SLAVE_ID, (ad7124_st_reg *)&ad7124_regs, masterSpi);(运行到这开始调用自己写的函数

上面函数调用初始化ADC的函数,通过SPI写数据写入控制命令,读数据)
int32_t AD7124_Setup(ad7124_device *device, int slave_select,ad7124_st_reg *regs, SPI_Handle a)
{int32_t ret;unsigned char i=0;enum ad7124_registers regNr;if(!device || !regs)return INVALID_VAL;device->regs = regs;device->slave_select_id = slave_select;device->spi_rdy_poll_cnt = 25000;ret = AD7124_Reset(device, a);
—————( reset函数里调用了写SPI函数,运行正常,reset函数和spi写函数如下int32_t AD7124_Reset(ad7124_device *device, SPI_Handle b)
{int32_t ret = 0;uint8_t wrBuf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};if(!device)return INVALID_VAL;
ret = AD7124_SPI_Write(device->slave_select_id, wrBuf, 8, b);
/* Wait for the reset to complete */
//ret = AD7124_WaitToPowerOn(device, device->spi_rdy_poll_cnt, b);return ret;
}

unsigned char AD7124_SPI_Write(unsigned char slaveDeviceId,unsigned char* data,unsigned char bytesNumber,SPI_Handle masterSpi)
{uint8_t i=0;SPI_Transaction transaction;memset((void *) masterTxBuffer, 0, SPI_MSG_LENGTH);for(i=0; i<bytesNumber; i++){masterTxBuffer[i] =data[i];}transaction.count = bytesNumber;transaction.txBuf = (void *) masterTxBuffer;SPI_transfer(masterSpi, &transaction);return 0;
}——————
函数继续
if (ret < 0)return ret;
ret = AD7124_ReadRegister(device, &regs[AD7124_ID], a);
———(程序运行到这里就出错了,用到的函数如下
int32_t AD7124_ReadRegister(ad7124_device *device, ad7124_st_reg* pReg, SPI_Handle b)(读寄存器函数,调用下面函数)
{int32_t ret;if (pReg->addr != AD7124_ERR_REG && device->check_ready){ret = AD7124_WaitForSpiReady(device, device->spi_rdy_poll_cnt, b);if (ret < 0)return ret;}
ret = AD7124_NoCheckReadRegister(device, pReg, b);
return ret;
}
int32_t AD7124_NoCheckReadRegister(ad7124_device *device, ad7124_st_reg* pReg, SPI_Handle c)
{int32_t ret= 0;uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};uint8_t i= 0;uint8_t check8= 0;uint8_t msgBuf[8] = {0, 0, 0, 0, 0, 0, 0, 0};if(!device || !pReg)return INVALID_VAL;/* Build the Command word */buffer[0] = AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD |AD7124_COMM_REG_RA(pReg->addr);/* Read data from the device */ret = AD7124_SPI_Read(device->slave_select_id,buffer,((device->useCRC != AD7124_DISABLE_CRC) ? pReg->size + 1: pReg->size) + 1, c);if(ret < 0)return ret;
/* Check the CRC */if(device->useCRC == AD7124_USE_CRC){msgBuf[0] = AD7124_COMM_REG_WEN | AD7124_COMM_REG_RD |AD7124_COMM_REG_RA(pReg->addr);for(i = 1; i < pReg->size + 2; ++i){msgBuf[i] = buffer[i];}check8 = AD7124_ComputeCRC8(msgBuf, pReg->size + 2);}
if(check8 != 0){/* ReadRegister checksum failed. */return COMM_ERR;}
/* Build the result */pReg->value = 0;for(i = 1; i < pReg->size + 1; i++){pReg->value <<= 8;pReg->value += buffer[i];}
return ret;
}
unsigned char AD7124_SPI_Read(unsigned char slaveDeviceId,(调用此函数读字节,只要我向spi-read函数里写入以下程序,程序运行就会出错,进入DMA错误中断程序死循环,这也是我遇到的主要问题)unsigned char* data,unsigned char bytesNumber,SPI_Handle masterSpi)
{uint8_t i=0;SPI_Transaction transaction;transaction.count = SPI_MSG_LENGTH;masterTxBuffer[0] =data[0];transaction.txBuf = (void *) masterTxBuffer;SPI_transfer(masterSpi, &transaction);(我需要先写入控制命令,才能读取数据)memset((void *) masterRxBuffer, 0, SPI_MSG_LENGTH);//将读数据buffer清空,准备接收下一组数据for(i=1; i<bytesNumber; i++){data[i] = masterRxBuffer[i];}transaction.rxBuf = (void *) masterRxBuffer;SPI_transfer(masterSpi, &transaction);
}
———–请您帮我看一下吧,如果还需要示波器波形我再传给您

,

Susan Yang:

我大体看了下您的代码,感觉没什么问题。若是可以的话,还请给出示波器波形,谢谢

,

user6390304:

 我把spi-read函数内的内容都删除掉,程序才能正常运行,正常运行,采集SCLK管脚没有波形。采集芯片输出引脚有如下波形

赞(0)
未经允许不得转载:TI中文支持网 » CC3220SF写SPI程序调试
分享到: 更多 (0)