|
楼主
查看: 6248回复: 11
发表于 2021-4-11 17:55:12
只看该作者
在普通的SPI传输中,MSP432E的硬件FSS引脚会在每次传输完成一个字节以后拉高,而很多外设都在读取/写入大量数据时都要求传输多字节过程中片选信号保持低。因此MSP432E单片机提供了高级模式,使FSS在整个传输过程中保持低电平,下面是技术参考手册的原文(第23章1527页,SSInFSS Function)
For enhanced modes of operation, the SSInFss signal can be programmed to assert low at the start of each byte transfer for one clock or the entire frame. This is configured by programming the FSSHLDFRM bit in the SSICR1 register. The EOM bit is also provided to signify end of frame transmission. This bit is embedded in the TXFIFO entry for use at the interface to de-assert SSInFss at the appropriate time. The FSSHLDFRM bit can also be used when operating in 8-bit legacy SSI mode.
对此我的理解是,当使能了高级模式以后,SPI传输过程中FSS引脚将不会被拉高,直到EOM位被置位,标志下一字节是帧结束,此字节数据被发送完成后FSS引脚才会重新拉高
在MSP432E系列的Driverlib当中,有开启高级模式和发送帧结束字节的函数,如下所示
- void SSIAdvFrameHoldEnable(uint32_t ui32Base)
- void SSIAdvDataPutFrameEnd(uint32_t ui32Base, uint32_t ui32Data )
复制代码
根据技术参考手册和Driverlib的说明,我认为使用高级模式进行spi传输应该在配置和启动外设以后,首先调用开启高级模式的函数,然后使用 SSIDataPut() 函数发送一些数据,到最后一个字节时,则调用 SSIAdvDataPutFrameEnd() 函数发送最后一个字节并指示FSS引脚拉高。代码如下
- /* Enable clocks to GPIO Port Q and configure pins as SSI */
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);
- while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOQ)))
- {
- }
- MAP_GPIOPinConfigure(GPIO_PQ0_SSI3CLK);
- MAP_GPIOPinConfigure(GPIO_PQ1_SSI3FSS);
- MAP_GPIOPinConfigure(GPIO_PQ2_SSI3XDAT0);
- MAP_GPIOPinConfigure(GPIO_PQ3_SSI3XDAT1);
- MAP_GPIOPinTypeSSI(GPIO_PORTQ_BASE, (GPIO_PIN_0 | GPIO_PIN_1 |
- GPIO_PIN_2 | GPIO_PIN_3));
- /* Enable the clock to SSI-0 module and configure the SSI Master */
- MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3);
- while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_SSI3)))
- {
- }
- MAP_SSIConfigSetExpClk(SSI3_BASE, systemClock, SSI_FRF_MOTO_MODE_0,
- SSI_MODE_MASTER, 100000, 8);
- MAP_SSIEnable(SSI3_BASE);
- SSIAdvFrameHoldEnable(SSI3_BASE);
- SSIDataPut(SSI3_BASE, 0xAA);
- SSIDataPut(SSI3_BASE, 0xAA);
- SSIDataPut(SSI3_BASE, 0xAA);
- SSIDataPut(SSI3_BASE, 0xAA);
- SSIAdvDataPutFrameEnd(SSI3_BASE, 0xBB);
- SSIAdvFrameHoldDisable(SSI3_BASE);
复制代码
但是逻辑分析仪抓取的波形显示并没有起到预期的效果,FSS引脚仍然在传输每个字节以后置高。逻辑分析仪得到的波形如下所示 |
|