[ARM9、LPC] SPI通信问题:每发2字节就丢掉2字节

[复制链接]
 楼主| zyjia 发表于 2019-4-26 12:00 | 显示全部楼层 |阅读模式
芯片:FH8610
系统:ucos
SPI参数:位宽16bit,时钟6.75MHz,极性0,相位0
问题:该芯片(从机)与wifi模块(主机)进行SPI通信时,原本要发送buf是“123456789123456789”,但实际测到的却是“1256914589”,也就是每发2字节就丢了2字节,但接收来自WiFi的数据却是正常的。
  1. void config_spi( int id )
  2. {
  3.     Spi_Enable( id, 0 );
  4.     Spi_SetFrameFormat( id, SPI_MOTOROLA_MODE );
  5.     Spi_SetPolarity( id, SPI_POLARITY_LOW );
  6.     Spi_SetPhase( id, SPI_TXR_PHASE );
  7.     Spi_SetDataSize( id, ((SPI_UNIT_TR_BITS == 8) ? SPI_DATA_SIZE_8BIT : 0xf));
  8.     Spi_SetTransferMode( id, SPI_TX_RX_MODE );
  9.     Spi_DisableIrq( id, SPI_IRQ_ALL );
  10.     Spi_SetDmaTxDataLevel( id, 12 );        //12
  11.     Spi_SetDmaRxDataLevel( id, 3 );         //3
  12.     Spi_SetDmaControlDisable( id, SPI_DMA_RX_POS | SPI_DMA_TX_POS );
  13.      
  14. }
  15. static void config_dma_rx( int ch )
  16. {
  17.     Dma_ClearIsrBit(ch,(DMA_INTT_TXR | DMA_INTT_BLOCK | DMA_INTT_SOURCE | DMA_INTT_DEST | DMA_INTT_ERR)); // new add
  18.      
  19.     Dma_SetTxrType( ch, DMA_TTFC_P2M_DMAC );
  20.     Dma_SetSrcWidth( ch, ((SPI_UNIT_TR_BITS == 8) ? DMA_TXR_8BITS : DMA_TXR_16BITS));
  21.     Dma_SetSrcSize( ch, DMA_BURST_4 );
  22.     Dma_SetDstWidth( ch, DMA_TXR_32BITS );  //DMA_TXR_32BITS
  23.     Dma_SetDstSize( ch, DMA_BURST_4 );
  24.     Dma_SetSrcIncDirection( ch, DMA_DIR_UNCHG );
  25.     Dma_SetDstIncDirection( ch, DMA_DIR_INC );
  26.     Dma_SetSrcHsMode( ch, DMA_HSMODE_HARDWARE );
  27.     Dma_SetFifoMode( ch, 1 );
  28.     Dma_SetFlowCtrl( ch, 1 );
  29.     Dma_SetHProt( ch, 6 );
  30.     Dma_EnableIsrBit( ch, DMA_INTT_BLOCK );
  31. }

  32. static void config_dma_tx( int ch )
  33. {
  34.     Dma_ClearIsrBit(ch,(DMA_INTT_TXR | DMA_INTT_BLOCK | DMA_INTT_SOURCE | DMA_INTT_DEST | DMA_INTT_ERR));// new add

  35.     Dma_SetTxrType( ch, DMA_TTFC_M2P_DMAC );
  36.     Dma_SetSrcWidth( ch, DMA_TXR_32BITS );  //DMA_TXR_32BITS
  37.     Dma_SetSrcSize( ch, DMA_BURST_4 );
  38.     Dma_SetDstWidth( ch, ((SPI_UNIT_TR_BITS == 8) ? DMA_TXR_8BITS : DMA_TXR_16BITS));
  39.     Dma_SetDstSize( ch, DMA_BURST_4 );
  40.     Dma_SetSrcIncDirection( ch, DMA_DIR_INC );
  41.     Dma_SetDstIncDirection( ch, DMA_DIR_UNCHG );
  42.     Dma_SetDstHsMode( ch, DMA_HSMODE_HARDWARE );
  43.     Dma_SetFifoMode( ch, 1 );
  44.     Dma_SetFlowCtrl( ch, 1 );
  45.     Dma_SetHProt( ch, 6 );
  46.     Dma_EnableIsrBit( ch, DMA_INTT_BLOCK );
  47. }
  48. int spi_one_cycle_transfer(UINT8 idx,const UINT8 *tx_buff,UINT8 *rx_buff,UINT32 len)
  49. {
  50.     UINT8 ret;
  51.      
  52. //1.wait master pull up ack gpio
  53.     OSSemPend(sem_wifi_ack_gpio, 0, &ret );
  54. //2.pull up slaver ack gpio
  55.     //Gpio_SetPortX(HW_HELP_SPI_GPIO,1);
  56. //3.block to exchange data
  57. #if 0
  58.     Spi_WriteReadBlock(idx,tx_buff,rx_buff,len);
  59. #else
  60.     config_spi(g_spi_chan);
  61.     Spi_SetDmaControlEnable( idx, SPI_DMA_RX_POS | SPI_DMA_TX_POS );
  62.     Spi_Enable( g_spi_chan, 1 );
  63.      

  64.     //config tx
  65.     config_dma_tx( g_spitx_dma_chan );
  66.     Dma_SetSrcAddress( g_spitx_dma_chan, (unsigned int)tx_buff );
  67.     Dma_SetDstAddress( g_spitx_dma_chan, SPI_DATA_REG );
  68.     Dma_SetDstPer( g_spitx_dma_chan, DMA_HSP_SPI2TX );
  69.     Dma_SetTxrSize( g_spitx_dma_chan, len >> 2 );
  70.     Dma_EnableChan( g_spitx_dma_chan );
  71.      
  72.     //config rx
  73.     config_dma_rx( g_spirx_dma_chan );
  74.     Dma_SetSrcAddress( g_spirx_dma_chan, SPI_DATA_REG );
  75.     Dma_SetDstAddress( g_spirx_dma_chan, (unsigned int)rx_buff );
  76.     Dma_SetSrcPer( g_spirx_dma_chan, DMA_HSP_SPI2RX );
  77.     Dma_SetTxrSize( g_spirx_dma_chan, (SPI_UNIT_TR_BITS == 8) ? len : (len >> 1));
  78.     Dma_EnableChan( g_spirx_dma_chan );

  79.      

  80.     Gpio_SetPortX(HW_HELP_SPI_GPIO,1);
  81.     OSSemPend(g_dmaSpiRx_done, 0, &ret);    //don't wait forever,need to change
  82. #endif

  83. //4.pull down slaver ack gpio
  84.     Gpio_SetPortX(HW_HELP_SPI_GPIO,0);

  85.     return 0;

  86. }

  87. static void _spiFrCCThreadFun(void *param)
  88. {
  89.     static unsigned char slaveRxBuff[1200] = {0};
  90.     static unsigned char slaveTxBuff[1200] = "hellothisisfh8610";
  91.      
  92.     UINT8 ret;


  93.     sem_wifi_ack_gpio = OSSemCreate(0);
  94.      
  95.     while(1)
  96.     {
  97. //1.check msg queue first.if it have,mean dsp want to send something initiative
  98.      
  99. //2.package data
  100.      
  101. //3.exchange data   
  102.     spi_one_cycle_transfer(g_spi_chan, slaveTxBuff, slaveRxBuff, 600);
  103.     uprintf("_spiFrCCThreadFun slaveRxBuff=%x-%x-%x-%x-%x-%x\n",slaveRxBuff[0],
  104.         slaveRxBuff[1],slaveRxBuff[2],slaveRxBuff[3],slaveRxBuff[4],slaveRxBuff[5]);
  105. //4.unpackage data
  106.      
  107. //5.analysis data
  108.      
  109.     }
  110. }
 楼主| zyjia 发表于 2019-4-26 12:02 | 显示全部楼层
有遇到类似现象的嘛,代码中的"hellothisisfh8610",实际用逻辑分析仪抓到的是“heotsih80”
airwill 发表于 2019-5-3 22:36 | 显示全部楼层
感觉是寄存器写的问题吧,还没有发送完成就写了寄存器或者清除了发送缓冲
 楼主| zyjia 发表于 2019-5-5 19:22 | 显示全部楼层
airwill 发表于 2019-5-3 22:36
感觉是寄存器写的问题吧,还没有发送完成就写了寄存器或者清除了发送缓冲 ...

终于找到原因了,是主机的CS脚控制参数设置不当导致的,spiCC3220SDMAHWAttrs.csControl应该为SPI_SW_CTRL_CS,而不是SPI_HW_CTRL_CS,之前一直还以为是DMA的问题。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部