你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

双MCU通过SPI DMA发送接收数据有错误

[复制链接]
scfor123456 提问时间:2019-8-24 17:08 /
主机定时发送一串数据0xaa,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,从机同样定时更新需发送的数据0x55,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,用三线制,没有用NSS,用示波器抓数据发现从机回的各数据位置有移位,下两图为不同时刻的波形,绿色为主发从,黄色为从发主。

2

2

1

1
收藏 评论18 发布时间:2019-8-24 17:08

举报

18个回答
scfor123456 回答时间:2019-8-28 15:17:10
uwyciw100 发表于 2019-8-28 11:27
做过一次SPI从设备。当时是配置从设备使用NSS,和DMA。两者都要使用,才能正常工作。 ...

#define FUNCTION_TO_MOTOR_NUM_MAX 10
#define MOTOR_TO_FUNCTION_NUM_MAX 10

uint8_t gSendToMotorDataBuff1[FUNCTION_TO_MOTOR_NUM_MAX];
uint8_t gSendToFunctionDataBuff1[MOTOR_TO_FUNCTION_NUM_MAX]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};

/**
  * @brief  GPIO的初始化配置函数
  * @param  无
  * @retval 无
  */
void spi2_Init(void)
{
        spi2_dma1_init();
       
   /* Enable the peripheral clock SPI2 */
  RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;

  /* Configure SPI2 in slave */
  /* nSS hard, slave, CPOL and CPHA at zero (rising first edge) */
  /* (1) TX and RX with DMA, RXNE IT, 8-bit Rx fifo */
  /* (2) Enable SPI2 */
  SPI2->CR2 = SPI_CR2_TXDMAEN | SPI_CR2_RXDMAEN | SPI_CR2_RXNEIE | SPI_CR2_FRXTH | SPI_CR2_DS_2 | SPI_CR2_DS_1 | SPI_CR2_DS_0|SPI_CR2_FRF; /* (1) */
  SPI2->CR1 |= SPI_CR1_SPE; /* (2) */       
               
}

void spi2_dma1_init(void)
{
  /* Enable the peripheral clock DMA11 */
  RCC->AHBENR |= RCC_AHBENR_DMA1EN;
  
  /* DMA1 Channel4 SPI2_RX config */
  /* (1) Peripheral address */
  /* (2) Memory address */
  /* (3) Data size */
  /* (4) Memory increment */
  /*     Peripheral to memory */
  /*     8-bit transfer */
  /*     Transfer complete IT */
  DMA1_Channel4->CPAR = (uint32_t)&(SPI2->DR); /* (1) */
  DMA1_Channel4->CMAR = (uint32_t)gSendToMotorDataBuff1; /* (2) */
  DMA1_Channel4->CNDTR = FUNCTION_TO_MOTOR_NUM_MAX; /* (3) */
  DMA1_Channel4->CCR |= DMA_CCR_MINC | DMA_CCR_TCIE  | DMA_CCR_EN; /* (4) */
  
  /* DMA1 Channel5 SPI2_TX config */
  /* (5) Peripheral address */
  /* (6) Memory address */
  /* (7) Memory increment */
  /*     Memory to peripheral*/
  /*     8-bit transfer */
  DMA1_Channel5->CPAR = (uint32_t)&(SPI2->DR); /* (5) */
  DMA1_Channel5->CMAR = (uint32_t)gSendToFunctionDataBuff1; /* (6) */
  DMA1_Channel5->CCR |= DMA_CCR_MINC | DMA_CCR_DIR; /* (7) */
  DMA1_Channel5->CNDTR = MOTOR_TO_FUNCTION_NUM_MAX; /* Data size */
  DMA1_Channel5->CCR |= DMA_CCR_EN;       
       
  /* Configure IT */
  /* (8) Set priority for DMA1_Channel4_IRQn */
  /* (9) Enable DMA1_Channel4_IRQn */
  NVIC_SetPriority(DMA1_Channel4_IRQn, 0); /* (8) */
  NVIC_EnableIRQ(DMA1_Channel4_IRQn); /* (9) */
       
}

/**
  * @brief  This function handles DMA1 channel 4 TC interrupt request.
  * @param  None
  * @retval None
  */
void DMA1_Channel4_IRQHandler(void)
{
  if((DMA1->ISR & DMA_ISR_TCIF4) == DMA_ISR_TCIF4)
  {
    DMA1->IFCR |= DMA_IFCR_CTCIF4; /* Clear TC flag */
   
    DMA1_Channel4->CCR &=~ DMA_CCR_EN;
        DMA1_Channel4->CMAR = (uint32_t)gSendToMotorDataBuff1; /* (2) */
    DMA1_Channel4->CNDTR = FUNCTION_TO_MOTOR_NUM_MAX; /* Data size */
    DMA1_Channel4->CCR |= DMA_CCR_EN;
               
        spi2_send_data();
  }
}



void spi2_send_data(void)
{
        uint8_t i;
        gSendToFunctionDataBuff1[0]=gSendToMotorDataBuff1[0];
        for(i=1;i<MOTOR_TO_FUNCTION_NUM_MAX;i++)
        {
                gSendToFunctionDataBuff1=gSendToMotorDataBuff1;
        }
  /* start 16-bit transmission with DMA*/
  /* Prepare Slave */
  DMA1_Channel5->CCR &=~ DMA_CCR_EN;
  DMA1_Channel5->CMAR = (uint32_t)gSendToFunctionDataBuff1; /* (6) */
  DMA1_Channel5->CNDTR = MOTOR_TO_FUNCTION_NUM_MAX; /* Data size */
  DMA1_Channel5->CCR |= DMA_CCR_EN;       

}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
请帮我看看从机的处理,DMA接收中断中更新下次需发送的数据,主机是定时发送10个数据,从机接收后元数据返回给主机。
scfor123456 回答时间:2019-8-27 18:39:11
wenyangzeng 发表于 2019-8-26 19:11
在软件里完成,在你发送数据开始之前先发送一字节特定码,比如0x55aa,接下去才是数据字节,这样就能够让 ...

我现在加了NSS引脚,用TI模式,通讯收发数据波形正确,但通过仿真读出的内存值不正确。比如我主机一次发 1,2,3,4,5,-1,-2,-3,-4,-5,从机接收到后再原数据发送回来,主机的收发引脚数据波形如下,但内存地址显示数据为0,0,65535,65535,32764,65532,32761,32768,0,1。
微信图片_20190827183942.jpg
DavidTan 回答时间:2019-8-26 09:31:48
我觉得不是移位,是整个数据都有了偏置,按你的两张图的显示,第一张图应该是
主机发:aa 01 02 03 04 05 06 07 08 09
从机回:05 06 07 08 09 55 01 02 03 04

第二张图应该是:
主机发:aa 01 02 03 04 05 06 07 08 09
从机回:08 09 55 01 02 03 04 05 06 07

你应该看看从机的数据处理部分。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

scfor123456 回答时间:2019-8-26 09:10:28
顶,请大侠指点指点如何解决这个问题。
scfor123456 回答时间:2019-8-26 09:45:03
tgw860910 发表于 2019-8-26 09:31
我觉得不是移位,是整个数据都有了偏置,按你的两张图的显示,第一张图应该是
主机发:aa 01 02 03 04 05 0 ...

我知道是从机处理有问题,但如何保证主机发AA的时候,从机能发55呢?
wenyangzeng 回答时间:2019-8-26 10:01:05
绿色数据滞后了黄色数据2个字节,应该是时钟同步出了问题,2路数据发送前先清空一下缓冲区和所有标志位看看。
scfor123456 回答时间:2019-8-26 10:56:22
wenyangzeng 发表于 2019-8-26 10:01
绿色数据滞后了黄色数据2个字节,应该是时钟同步出了问题,2路数据发送前先清空一下缓冲区和所有标志位看看 ...

看波形绿色和黄色的时间是一致的啊
wenyangzeng 回答时间:2019-8-26 11:12:56
scfor123456 发表于 2019-8-26 10:56
看波形绿色和黄色的时间是一致的啊

上一贴没有表达清楚:
第1图黄色滞后5字节,第2图黄色滞后2字节
scfor123456 回答时间:2019-8-26 11:39:14
wenyangzeng 发表于 2019-8-26 11:12
上一贴没有表达清楚:
第1图黄色滞后5字节,第2图黄色滞后2字节

有时滞后字节数固定,有时不固定,这个跟寄存器配置有关系吗
wenyangzeng 回答时间:2019-8-26 13:07:29
scfor123456 发表于 2019-8-26 11:39
有时滞后字节数固定,有时不固定,这个跟寄存器配置有关系吗

SPI通讯使用同一个时钟,应该是没有确定双机通讯时的起始位
scfor123456 回答时间:2019-8-26 16:06:00
wenyangzeng 发表于 2019-8-26 13:07
SPI通讯使用同一个时钟,应该是没有确定双机通讯时的起始位

如何确定起始位?
wenyangzeng 回答时间:2019-8-26 16:18:04
scfor123456 发表于 2019-8-26 16:06
如何确定起始位?

至少应该规定一个握手信号,表示主机1帧数据发送开始,从机接收到握手信号后紧跟着是数据

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

scfor123456 回答时间:2019-8-26 16:31:45
wenyangzeng 发表于 2019-8-26 16:18
至少应该规定一个握手信号,表示主机1帧数据发送开始,从机接收到握手信号后紧跟着是数据 ...

握手信号是通过软件给,还是硬件给?
wenyangzeng 回答时间:2019-8-26 19:11:29
scfor123456 发表于 2019-8-26 16:31
握手信号是通过软件给,还是硬件给?

在软件里完成,在你发送数据开始之前先发送一字节特定码,比如0x55aa,接下去才是数据字节,这样就能够让主、从机同步。
scfor123456 回答时间:2019-8-27 18:46:17
这个到底是怎么回事?
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版