虽然说SPI在接收模式下,SPIi的从设备理论上不考虑MOSI引脚的值,但是我觉得还是有必要在此提一下。看看原厂工程师是否有办法改善。
使用官方示例代码,直接使用DMA收发
/********************************** (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可以使用官方的示例测试调查。
|
|
@WCHTech2 : 请问要如何清除R8_SPI0_BUFFER呢 在我将R8_SPI0_BUFFER = 0xFF,还是没有解决该问题
接收的时候清空一下R8_SPI0_BUFFER即可。