主题中讨论的其他器件:MSP430WARE、
大家好、我要将16位数据从 MSP430FR5929 (LaunchPad)作为 SPI 主器件写入 SPI 从器件(AD9833 -信号发生器)。 我正在使用修改 后的 MSP430Ware:TI MSP430Ware SDK 中的 eusci_b_spi_ex1_master.c 源代码)。 该程序正常工作。
但是、当前我的程序首先传输高字节、然后是低字节的 TX。 这会在两次传输之间引入轻微延迟(~72微秒)。 我想知道是否可以一次发送16位、或者至少显著减少两个 TX 事件之间的延迟。
我列出 了时钟信号的我的代码和示波器跟踪图像。 目前、MCU 仅发送8个时钟信号、想知道可以在一个数据流中发送16个时钟信号和相关数据、而不是当前的两个数据块。 如果这是使用此 MCU 可以实现的最佳效果、则没关系。 但想看看是否有任何方法来优化 TX。
提前感谢您提出的任何想法/建议。
/*
*基于 TI MSP430Ware:适用于 MSP430FR5969的 eusci_b_spi_ex1_master.c
*
#include "driverlib.h"
void main (void)
{
volatile uint16_t i;
#define Elements 5.
#define AD9833_FSYNC GPIO_PIN5
uint16_t TXData6[元素]={0x2100、0x50C7、0x40、0xC000、0x2000};//400Hz -来自 AD9833应用手册:AN-10-70
uint8_t AD9833_HighByte = 0;//暂时保持高字节
uint8_t AD9833_LowByte = 0;//暂时保持低字节
INT k;//在 SPI 传输期间 TXData[]的计数器
//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);
// AD9833芯片选择引脚配置
GPIO_setAsOutputPin (GPIO_PORT_P1、AD9833_FSYNC);//使用引脚1.5作为芯片选择信号
GPIO_setOutputHighOnPin (GPIO_PORT_P1、AD9833_FSYNC);// AD9833芯片选择在 AD9833_FSYNC 为低电平时启用
//将 DCO 频率设置为最大 DCO 设置
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_3);
//选择 DCO 作为没有分频器的 SMCLK 的时钟源
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_Clock_divider);
/*
*选择端口2
*将引脚2设置为输入次级模块功能、(UCB0CLK)。
*
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P2、
GPIO_PIN2、
GPIO_secondary 模块功能
);
/*
*选择端口1
*将引脚6、7设置为输入次级模块功能(UCB0TXD/UCB0SIMO、UCB0RXD/UCB0SOMI)。
*
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P1、
GPIO_PIN6 + GPIO_PIN7、
GPIO_secondary 模块功能
);
/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*
PMM_unlockLPM5 ();
//初始化 SPI 主设备
EUSCI_B_SPI_initMasterParam param ={0};
param.selectClockSource = EUSCI_B_SPI_CLOCKSOURCE_SMCLK;
param.clockSourceFrequency = CS_getSMCLK();
param.desiredSpiClock = 1000000;//1MHz 时钟频率
param.msbFirst = EUSCI_B_SPI_MSB_FIRST;
param.clockPhase = EUSCI_B_SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT;
param.clockPolarity = EUSCI_B_SPI_CLOCKPOLARITY_INACTION_HIGH;
param.spiMode = EUSCI_B_SPI_3引脚;
EUSCI_B_SPI_initMaster (EUSCI_B0_BASE、param);
//启用 SPI 模块
EUSCI_B_SPI_ENABLE (EUSCI_B0_BASE);
//等待从器件初始化
_DELAY_CYCLES (100);
//USCI_B0 TX 缓冲器准备好了吗?
while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、
EUSCI_B_SPI_Transmit 中断);
/*
*开始 AD9833寄存器数据的 SPI 传输
*
对于(k=0;k <元素;k++)
{
AD9833_HighByte =(TXData6[k]>8)&0xFF;//从16位字中提取高字节
AD9833_LowByte = TXData6[k]&0xFF;//从16位字中提取低字节
//激活 AD9833芯片选择
GPIO_setOutputLowOnPin (GPIO_PORT_P1、AD9833_FSYNC);
//向从器件发送数据
EUSCI_B_SPI_transmitData (EUSCI_B0_BASE、AD9833_HighByte);//首先发送 High Byte
//USCI_B0 TX 缓冲器准备好了吗?
while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、
EUSCI_B_SPI_Transmit 中断);
//向从器件发送数据
EUSCI_B_SPI_transmitData (EUSCI_B0_BASE、AD9833_LowByte);//下一步发送低字节
//USCI_B0 TX 缓冲器准备好了吗?
while (!EUSCI_B_SPI_getInterruptStatus (EUSCI_B0_BASE、
EUSCI_B_SPI_Transmit 中断);
//取消激活 AD9833芯片选择
GPIO_setOutputHighOnPin (GPIO_PORT_P1、AD9833_FSYNC);
}
_NO_OPERATION ();//保持在 LPM0中
}
