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.

[参考译文] MSP-EXP432E401Y:用于 BOOST-DAC8568的 SPI 32位通信(不间断)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1179934/msp-exp432e401y-spi-32-bit-communication-uninterrupted-for-boost-dac8568

器件型号:MSP-EXP432E401Y
主题中讨论的其他器件: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 (&params);
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);

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

    您好!

     空闲周期来自 SSI 硬件。 SSI 内部的状态机正在启动一个新的传输。 我建议您尝试16位数据长度、以便为32位消息发送2x16位。 SSI 模块不支持32位。  

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

    我将尝试这样做、尽管由于这个原因、DAC-8568可能与这个器件完全不兼容、因为它具有32位字长。