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

SPI问题还没有解决

[复制链接]
scfor123456 提问时间:2019-8-29 09:01 /
贴出从机处理的代码,从机在中断中完成接收和准备下一次发送的数据,主机是定时发送一串数据。
可见原帖https://www.stmcu.org.cn/module/forum/thread-621583-1-2.html


#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****/


收藏 评论6 发布时间:2019-8-29 09:01

举报

6个回答
DavidTan 回答时间:2019-8-29 10:16:29
SPI是同步通讯,这是首先要注意的。
主机发送一个字节的数据,同时从机也要发送一个字节。
不能是主机发送完一整串数据之后,再由从机回应数据,所以你要认真考虑一下主从机的数据发送应答的处理流程。
以上是我的愚见
scfor123456 回答时间:2019-8-29 11:26:00
tgw860910 发表于 2019-8-29 10:16
SPI是同步通讯,这是首先要注意的。
主机发送一个字节的数据,同时从机也要发送一个字节。
不能是主机发送 ...

我也知道是从机处理问题,但在DMA下如何操作呢,直接往SPI->DR中先写一个数据来同步?
wenyangzeng 回答时间:2019-8-29 11:50:17
ST官方就有例程可以参考的:
FullDuplex_SoftNSS.rar (15.07 KB, 下载次数: 5)

评分

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

查看全部评分

五哥1 回答时间:2019-8-29 13:07:28
看看官方的例程
scfor123456 回答时间:2019-8-30 14:10:32
问题解决了,主MCU上电初始化做了个延时,保证主发之前,从机已初始化完毕,数据就不会错位了。仿真读出数据与波形不一致是驱动光耦能力不足,降低波特率问题就不存在了。
天臆弄人 回答时间:2019-8-31 11:43:12
还没解决吗,要解决办法也很简单啊,

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版