主题中讨论的其他器件:BOOST-DAC8568
执行 BOOST-DAC8568、它有一个32位字、前12位为控制位、后接16个数据位和4个额外位。 这是一条32位消息。 根据器件列表时序图、它必须是一个32位消息。 之前说过、Code Composer Studio SPI 接口库仅支持<= 8位字。 我用16进行了测试、虽然32个产生了错误、但它确实起作用了。 显而易见的解决方案是发送多条8位消息、但根据我的示波器、这会导致字节之间出现显著的暂停。 由于 DAC 以20MHz 的频率进行通信、因此延迟最终几乎为整个字节的数据大小。 熟悉此板或 DAC 的人是否知道此解决方案? 附件是示波器的图片。 黄色线是 MOSI、发送的消息是01010101 01010101 01010101 01010101。 紫色线是 μ~SYNC 引脚、当前仅为 GPIO。 同样值得注意的是、波形不是很矩形。 我认为这可能是我的200MHz 示波器、但我以前遇到过不支持高频 SPI 通信的 TI 评估板问题、现在我假设主要问题是消息时序。
我还附上了所使用的代码、尽管它看起来并不是很重要。 我也尝试了各种模式、但都有这种延迟或只是抛出错误。
[尝试使用代码块时出现服务器错误、抱歉]
//系统消息
#include
#define SYS_ERROR (msg) printf ("error |");printf (msg);printf ("\n");while (1){}
#include
#include
#include
#include
/*驱动程序头文件*/
#include
#include
#include
/*板头文件*/
#include "ti_drivers_config.h"
/*用于切换 LED 的回调。 *
void timerCallback (Timer_handle myHandle、int_fast16_t 状态);
// SPI VARS
#define SPI_MSG_LENGTH 4.
SPI_Handle SPI;
unsigned char spiTxBuffer[SPI_MSG_length];
unsigned char spiRxBuffer[SPI_MSG_length];
/*
*==== mainThread ====
*
void * mainThread (void * arg0){
Timer_handle timer0;
Timer_Params 参数;
/*调用驱动程序初始化函数*/
GPIO_init();
timer_init();
spi_init();
/*配置 LED 引脚*/
GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (CONFIG_GPIO_LED_1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (CONFIG_GPIO_SYNC、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
GPIO_setConfig (CONFIG_GPIO_LDAC、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
/*关闭用户 LED */
GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF);
//设置 SPI
SPI_Params spiParams;
/*将 SPI 句柄初始化为默认主控*/
SPI_Params_init (&spiParams);
spiParams.bitrate = 20000000;
spiParams.dataSize = 8;
spiParams.frameFormat = SPI_POL0_PHA0;
SPI = SPI_open (CONFIG_SPI_0、&spiParams);
if (SPI == NULL){
printf ("初始化 SPI\n"\n 时出错");
while (1);
}
否则{
printf ("SPI 已初始化\n");
}
/*
*将计时器设置为连续回调模式,以调用回调
*每1、000、000微秒或1秒运行一次。
*
Timer_Params_init (¶ms);
params.period = 1000000;
Params.periodUnits = Timer_Period_US;
params.timerMode = Timer_Continuous_callback;
params.timerCallback = timerCallback;
timer0 = Timer_open (CONFIG_TIMER_0、params);
if (timer0 =NULL){SYS_ERROR ("初始化计时器失败");}
if (Timer_start (timer0)= Timer_STATUS_ERROR){SYS_ERROR ("启动计时器失败");}
返回(空);
}
void timerCallback (Timer_handle myHandle、int_fast16_t status){
GPIO_TOGGLE (CONFIG_GPIO_SYNC);
SPI_Transaction 事务;
bool transferOK;
//ncpy (((char *) spiTxBuffer、"ffFFF"、SPI_MSG_LENGTH);
//spiTxBuffer[0]=(char)(0b01110000);
//spiTxBuffer[1]=(char)(0b00001111);
//spiTxBuffer[2]=(char)(0b11111111);
//spiTxBuffer[3]=(char)(0b11110000);
spiTxBuffer[0]=(char)(0b01010101);
spiTxBuffer[1]=(char)(0b01010101);
spiTxBuffer[2]=(char)(0b01010101);
spiTxBuffer[3]=(char)(0b01010101);
printf ("%c \n"、spiTxBuffer[0]);
transaction.count = SPI_MSG_length;
transaction.txBuf =(void *) spiTxBuffer;
transaction.rxBuf =(void *) spiRxBuffer;
transferOK = SPI_transfer (SPI、事务);
//if (transferOK){printf ("已发送消息... \n");}
//else{printf ("不成功的主 SPI 传输");}
GPIO_TOGGLE (CONFIG_GPIO_SYNC);
//负载 DAC 异步
GPIO_TOGGLE (CONFIG_GPIO_LDAC);
usleep(1);
GPIO_TOGGLE (CONFIG_GPIO_LDAC);
}