- /********************************** (C) COPYRIGHT *******************************
- * File Name : Main.c
- * Author : WCH
- * Version : V1.0
- * Date : 2020/08/06
- * Description : SPI0演示 Master/Slave 模式数据收发
- *******************************************************************************/
- #include "CH57x_common.h"
- __attribute__((aligned(4))) UINT8 spiBuff[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
- __attribute__((aligned(4))) UINT8 spiBuffrev[16];
- void DebugInit( void )
- {
- GPIOA_SetBits( GPIO_Pin_9 );
- GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
- GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
- UART1_DefInit();
- }
- int main()
- {
- UINT8 i;
- SetSysClock( CLK_SOURCE_PLL_60MHz );
- /* 配置串口调试 */
- DebugInit();
- PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );
- #if 1
- /* 主机模式 */
- PRINT( "1.spi0 mul master mode send data ...\n" );
- DelayMs( 100 );
- GPIOA_SetBits( GPIO_Pin_12 );
- GPIOA_ModeCfg( GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA );
- SPI0_MasterDefInit();
- #if 0
- // 单字节发送
- GPIOA_ResetBits( GPIO_Pin_12 );
- SPI0_MasterSendByte( 0x55 );
- GPIOA_SetBits( GPIO_Pin_12 );
- DelayMs( 1 );
- GPIOA_ResetBits( GPIO_Pin_12 );
- i = SPI0_MasterRecvByte();
- GPIOA_SetBits( GPIO_Pin_12 );
- DelayMs( 2 );
- // FIFO 连续发送
- GPIOA_ResetBits( GPIO_Pin_12 );
- SPI0_MasterTrans( spiBuff, 9 );
- GPIOA_SetBits( GPIO_Pin_12 );
- DelayMs( 1 );
- GPIOA_ResetBits( GPIO_Pin_12 );
- SPI0_MasterRecv( spiBuffrev, 12 );
- GPIOA_SetBits( GPIO_Pin_12 );
- DelayMs( 1 );
- #endif
- // DMA 连续发送
- GPIOA_ResetBits( GPIO_Pin_12 );
- SPI0_MasterDMATrans( spiBuff, 12 );
- GPIOA_SetBits( GPIO_Pin_12 );
- DelayMs( 1 );
- GPIOA_ResetBits( GPIO_Pin_12 );
- SPI0_MasterDMARecv( spiBuffrev, 12 );
- GPIOA_SetBits( GPIO_Pin_12 );
- PRINT( "END ...\n" );
- while( 1 )
- ;
- #endif
- #if 0
- /* 设备模式 */
- PRINT( "1.spi0 mul slave mode \n");
- GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_PU);
- SPI0_SlaveInit();
- i = SPI0_SlaveRecvByte();
- SPI0_SlaveSendByte( ~i );
- SPI0_SlaveRecv( spiBuffrev, 9 );
- SPI0_SlaveTrans( spiBuffrev, 12 );
- SPI0_SlaveDMARecv( spiBuffrev, 12 );
- SPI0_SlaveDMATrans( spiBuffrev, 12 );
- while(1);
- #endif
- while( 1 )
- ;
- }
通过逻辑分析仪抓取SPI的收发数据,分析捕获的数据可以发现:
1、DMA发送模式下能够从MOSI正常发送数据
2、切到DMA接收模式下,第一个从MOSI发送数据不为0xFF,该值为0x06
后面经过测试,发现该值与在DMA发送模式下传输的buffer有关系。
比如,
我将DMA发送模式下传输的buffer,修改为发送16个字节(原示例代码发送12字节长度).
此时,DMA接收模式下,第一个从MOSI发送数据不为0xFF,变为0x09
__attribute__((aligned(4))) UINT8 spiBuff[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
原厂FAE可以使用官方的示例测试调查。