搜索

[蓝牙芯片] CH573的SPI输出DMA模式下,使用DMA发送后,切到DMA接收时,首个...

[复制链接]
1703|6
lanjackg2003|  楼主 | 2021-5-17 10:40 | 显示全部楼层 |阅读模式
pi, spi, DMA, IO, gp, GPIO
虽然说SPI在接收模式下,SPIi的从设备理论上不考虑MOSI引脚的值,但是我觉得还是有必要在此提一下。看看原厂工程师是否有办法改善。

使用官方示例代码,直接使用DMA收发

  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name          : Main.c
  3. * Author             : WCH
  4. * Version            : V1.0
  5. * Date               : 2020/08/06
  6. * Description        : SPI0演示 Master/Slave 模式数据收发
  7. *******************************************************************************/

  8. #include "CH57x_common.h"

  9. __attribute__((aligned(4)))   UINT8 spiBuff[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6 };
  10. __attribute__((aligned(4)))   UINT8 spiBuffrev[16];

  11. void DebugInit( void )
  12. {
  13.   GPIOA_SetBits( GPIO_Pin_9 );
  14.   GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
  15.   GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
  16.   UART1_DefInit();
  17. }

  18. int main()
  19. {
  20.   UINT8 i;

  21.   SetSysClock( CLK_SOURCE_PLL_60MHz );

  22.   /* 配置串口调试 */
  23.   DebugInit();
  24.   PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );

  25. #if 1
  26.   /* 主机模式 */
  27.   PRINT( "1.spi0 mul master mode send data ...\n" );
  28.   DelayMs( 100 );

  29.   GPIOA_SetBits( GPIO_Pin_12 );
  30.   GPIOA_ModeCfg( GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14, GPIO_ModeOut_PP_5mA );
  31.   SPI0_MasterDefInit();

  32. #if 0
  33. // 单字节发送
  34.   GPIOA_ResetBits( GPIO_Pin_12 );
  35.   SPI0_MasterSendByte( 0x55 );
  36.   GPIOA_SetBits( GPIO_Pin_12 );
  37.   DelayMs( 1 );
  38.   GPIOA_ResetBits( GPIO_Pin_12 );
  39.   i = SPI0_MasterRecvByte();
  40.   GPIOA_SetBits( GPIO_Pin_12 );
  41.   DelayMs( 2 );

  42. // FIFO 连续发送
  43.   GPIOA_ResetBits( GPIO_Pin_12 );
  44.   SPI0_MasterTrans( spiBuff, 9 );
  45.   GPIOA_SetBits( GPIO_Pin_12 );
  46.   DelayMs( 1 );
  47.   GPIOA_ResetBits( GPIO_Pin_12 );
  48.   SPI0_MasterRecv( spiBuffrev, 12 );
  49.   GPIOA_SetBits( GPIO_Pin_12 );
  50.   DelayMs( 1 );
  51. #endif
  52. // DMA 连续发送
  53.   GPIOA_ResetBits( GPIO_Pin_12 );
  54.   SPI0_MasterDMATrans( spiBuff, 12 );
  55.   GPIOA_SetBits( GPIO_Pin_12 );
  56.   DelayMs( 1 );
  57.   GPIOA_ResetBits( GPIO_Pin_12 );
  58.   SPI0_MasterDMARecv( spiBuffrev, 12 );
  59.   GPIOA_SetBits( GPIO_Pin_12 );

  60.   PRINT( "END ...\n" );
  61.   while( 1 )
  62.     ;
  63. #endif

  64. #if 0
  65.   /* 设备模式 */
  66.   PRINT( "1.spi0 mul slave mode \n");
  67.   GPIOA_ModeCfg(GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_ModeIN_PU);
  68.   SPI0_SlaveInit();
  69.   i = SPI0_SlaveRecvByte();
  70.   SPI0_SlaveSendByte( ~i );

  71.   SPI0_SlaveRecv( spiBuffrev, 9 );
  72.   SPI0_SlaveTrans( spiBuffrev, 12 );
  73.   SPI0_SlaveDMARecv( spiBuffrev, 12 );
  74.   SPI0_SlaveDMATrans( spiBuffrev, 12 );

  75.   while(1);
  76. #endif

  77.   while( 1 )
  78.     ;

  79. }

复制代码
通过逻辑分析仪抓取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 | 显示全部楼层
7179160a2630a055ea.png
添加逻辑分析仪抓到的数据


使用特权

评论回复
单片小菜| | 2021-5-18 09:33 | 显示全部楼层
如果在里面增加一个短暂的延时,是不是会好一些呢?

使用特权

评论回复
lanjackg2003|  楼主 | 2021-5-18 10:48 | 显示全部楼层
单片小菜 发表于 2021-5-18 09:33
如果在里面增加一个短暂的延时,是不是会好一些呢?

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

使用特权

评论回复
勇敢的大白菜| | 2021-5-18 23:43 | 显示全部楼层
这个不知道怎么回事了,期待得到答案。

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

本版热帖

本版活跃用户

优质原创写原创,赢大奖

编辑推荐

  • 1 wolfe_yu 得到打赏 ¥170.00
  • 2 小叶三千 得到打赏 ¥160.00
  • 3 最美葫芦娃 得到打赏 ¥155.00
  • 4 呐咯密密 得到打赏 ¥135.00
  • 5 hk386 得到打赏 ¥100.00
  • 6 laocuo1142 得到打赏 ¥85.00
  • 7 木野臻 得到打赏 ¥60.00
  • 8 ezcui 得到打赏 ¥60.00
  • 9 wzx1994 得到打赏 ¥60.00
  • 10 年轻的国王 得到打赏 ¥60.00
在线客服 快速回复 返回顶部 返回列表