主题中讨论的其他部件: DAC8775
您好,
我正在使用 MSP-432P401R 来配置和使用DAC8775EVM板。 我在设备之间建立SPI通信时遇到了困难。
我的SPI配置如下所示,
void DAC_SPI_Init(void){
eUSI_SPI_MasterConfig spiMasterConfig =
{
EUSCI_B_SPI_CLOCKSOURCE_SMCLK, // SMCLK时钟源
cs_getSMCLK(), //获取SMCLK频率
48万, // SPICLK = 48 KHz
EUSCI_A_SPI_MSB_FIRST, // MSB优先
EUSCI_A_SPI_PHASE DATA_Captured_ONFIRST_Changed_on_NEXT,//相位
EUSCI_A_SPI_CLOCKPOLARITY_INACILY_HIGH,//高极性
EUSCI_A_SPI_3引脚 // 3线SPI模式
};
GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO端口P9,GPIO PIN7,GPIO主要模块功能);
GPIO_setAsPeripheralModuleFunctionInputPin (GPIO端口P9,GPIO PIN6,GPIO主要模块功能);
GPIO_setAsPeripheralModuleFunctionOutputPin (GPIO端口P9,GPIO _PIN5,GPIO主要模块功能);
GPIO_setAsOutputPin (GPIO端口P9,DAC_sync_PIN);
SPI_initMaster(EUSI_A3_base,&spiMasterConfig);
SPI_clearInterruptFlag (EUSCI_A3_BASE,EUSCI_A_SPI_Receive_interrupt);
SPI_enableModule(EUSI_A3_base);
}
我的读写功能就在这里,
void dc_spi_writeData (uint8_t地址,uint16_t数据)
{
UINT8_t ui8Data;
布尔状态;
//准备和发送字节2
ui8Data =地址;
GPIO _setOutputLowOnPin (GPIO端口P9,GPIO _PIN4);
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = ui8Data;
//准备和发送字节1
ui8Data =(uint8_t)(data >> 8);
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = ui8Data;
//准备并发送字节0
ui8Data =(uint8_t)(数据和0xff);
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = ui8Data;
__DELAY周期(600);
GPIO _setOutputHighOnPin (GPIO_PORT_P9, GPIO _PIN4);
}
uint16_t DAC_SPI_ReadData (uint8_t地址)
{
静态uint8_t ui8Data = 0x00;
INT8_t RxAddress = 0x00;
uint16_t Rxdata = 0x0000;
uint16_t shift= 0x0000;
//发送读取命令
地址=地址| 0x80;
///发送命令字节2
GPIO _setOutputLowOnPin (GPIO端口P9,GPIO _PIN4);
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF =地址;
///发送命令字节1
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = 0x00;
///发送命令字节0
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = 0x00;
__DELAY周期(600);
GPIO _SETTOutputHighOnPin (GPIO端口P9,GPIO _PIN4);
延迟(100);
///发送NOP命令以接收数据
GPIO _setOutputLowOnPin (GPIO端口P9,GPIO _PIN4);
//接收字节2
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = 0x00;
//Rxdata =(uint16_t) UCA3RXBUF;
RxAddress = SPI_receiveData(EUSSCI_A3_base);
//接收字节1
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = 0x00;
rxdata =(uint16_t)SPI_receiveData(EUSI_A3_base);
Rxdata = Rxdata <8;
//接收字节0
while (!SPI_getInterruptStatus (EUSCI_A3_BASE,
EUSCI_A_SPI_Transmit_Interrupt);
UCA3TXBUF = 0x00;
Shift =(uint16_t)SPI_receiveData(EUSI_A3_base);
Rxdata =(Rxdata和0xFF00)|移位;
__DELAY周期(600);
while (EUSCI_A_SPI_isBusy (EUSCI_A3_BASE));
GPIO_setOutputHighOnPin (GPIO端口P9,GPIO _PIN4);
返回Rxdata;
}
根据 DAC8775EVM的数据表, 我知道必须有NOP操作命令(24位)才能使用寄存器数据对miso行进行时钟处理,我始终从miso行获得0x0000。
尝试在CRO上封装miso行,并在NOP命令期间得到所有零(0x0万),并在发送24位读取命令时将一些随机位置于miso行中。
请告诉我我配置的正确性。
请务必为MSP432的DAC8775EVM提供简单SPI读/写功能的任何示例代码。
谢谢!