打印
[蓝牙芯片]

CH573的SPI输出DMA模式下,使用DMA发送后,切到DMA接收时,首个...

[复制链接]
4346|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pi, spi, DMA, IO, gp, GPIO
虽然说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可以使用官方的示例测试调查。




使用特权

评论回复
评论
lanjackg2003 2021-5-17 20:35 回复TA
@WCHTech2 : 请问要如何清除R8_SPI0_BUFFER呢 在我将R8_SPI0_BUFFER = 0xFF,还是没有解决该问题 
WCHTech2 2021-5-17 17:13 回复TA
接收的时候清空一下R8_SPI0_BUFFER即可。 
沙发
lanjackg2003|  楼主 | 2021-5-17 20:36 | 只看该作者

添加逻辑分析仪抓到的数据


使用特权

评论回复
板凳
单片小菜| | 2021-5-18 09:33 | 只看该作者
如果在里面增加一个短暂的延时,是不是会好一些呢?

使用特权

评论回复
地板
lanjackg2003|  楼主 | 2021-5-18 10:48 | 只看该作者
单片小菜 发表于 2021-5-18 09:33
如果在里面增加一个短暂的延时,是不是会好一些呢?

没有用
官方的示例代码延时1ms,结果还是仍然有这个问题
我试过延时100ms也仍然解决不了

使用特权

评论回复
5
勇敢的大白菜| | 2021-5-18 23:43 | 只看该作者
这个不知道怎么回事了,期待得到答案。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

56

主题

440

帖子

7

粉丝