请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP-EXP432P401R
您好!
我使用 MSP-432P401R 来配置和使用 DAC8775EVM 板。 我正在努力在器件之间建立 SPI 通信。
我的 SPI 配置如下所示、
void DAC_SPI_Init (void){ eUSCI_SPI_MasterConfig spiMasterConfig = { EUSCI_B_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 CS_getSMCLK()、 //获取 SMCLK 频率 480000、 // SPICLK = 48KHz EUSCI_A_SPI_MSB_FIRST、 // MSB 优先 EUSCI_A_SPI_PHASE_DATA_Captured_ONFIRST_Changed_ON_NEXT、//相位 EUSCI_A_SPI_CLOCKPOLARITY_INACT_HIGH、//高极性 EUSCI_A_SPI_3引脚 // 3线 SPI 模式 }; GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P9、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function); GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P9、GPIO_PIN6、GPIO_PRIMARY_MODULE_Function); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P9、GPIO_PIN5、GPIO_PRIMARY_MODULE_Function); GPIO_setAsOutputPin (GPIO_PORT_P9、DAC_SYNC_PIN); SPI_initMaster (EUSCI_A3_base、&spiMasterConfig); SPI_clearInterruptFlag (EUSCI_A3_base、EUSCI_A_SPI_Receive_interrupt); SPI_enableModule (EUSCI_A3_base); }
我的写入和读取函数在这里、
void DAC_SPI_writeData (uint8_t 地址、uint16_t 数据) { uint8_t ui8Data; bool 状态; //准备并发送字节2 ui8Data =地址; GPIO_setOutputLowOnPin (GPIO_PORT_P9、GPIO_PIN4); while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = ui8Data; //准备并发送字节1 ui8Data =(uint8_t)(数据>> 8); while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = ui8Data; //准备并发送字节0 ui8Data =(uint8_t)(data & 0xff); while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = ui8Data; _DELAY_CYCLES (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_PORT_P9、GPIO_PIN4); while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF =地址; ///发送命令字节1 while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = 0x00; //发送命令字节0 while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = 0x00; _DELAY_CYCLES (600); GPIO_setOutputHighOnPin (GPIO_PORT_P9、GPIO_PIN4); 延迟(100); ///发送 NOP 命令以接收数据 GPIO_setOutputLowOnPin (GPIO_PORT_P9、GPIO_PIN4); //接收字节2 while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = 0x00; //Rxdata =(uint16_t) UCA3RXBUF; RxAddress = SPI_receiveData (EUSCI_A3_base); //接收字节1 while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = 0x00; Rxdata =(uint16_t) SPI_receiveData (EUSCI_A3_base); Rxdata = Rxdata << 8; //接收字节0 while (!SPI_getInterruptStatus (EUSCI_A3_base、 EUSCI_A_SPI_Transmit 中断); UCA3TXBUF = 0x00; shift =(uint16_t) SPI_receiveData (EUSCI_A3_base); Rxdata =(Rxdata & 0xFF00)|移位; _DELAY_CYCLES (600); while (EUSCI_A_SPI_isBusy (EUSCI_A3_base)); GPIO_setOutputHighOnPin (GPIO_PORT_P9、GPIO_PIN4); 返回 Rxdata; }
根据 DAC8775EVM 的数据表 、我知道必须有一个 NOP 操作命令(24位)来使用寄存器数据时钟输出 MISO 线路、我始终从 MISO 线路获得0x0000。
在发送24位读取命令时、尝试将 MISO 行粘贴到 CRO 上、并在 NOP 命令期间获得所有零(0x000000)、并在 MISO 行中添加一些随机位。
请告知我配置的正确性。
请为 MSP432的 DAC8775EVM 提供简单 SPI 读/写功能的任何示例代码。
谢谢、