STM32的从机SPI接收数据错位问题

分析后的原因是因为主机和从机的时钟相位和极性一致。所以在主机发的时候,从机同时也收会有问题。不过有些人可能这样做也正常,不过我测试中没有正常过。
从机:
SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA =SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS =SPI_NSS_Hard;
主机:
     SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
测试后主机、从机收到的数据都正常。没有出现错误的问题。
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
STM32H7中,可以通过SPI+DMA来实现SPI从机发送数据。下面是一个示例代码: ```c #include "stm32h7xx.h" #define BUFFER_SIZE 10 uint8_t txBuffer[BUFFER_SIZE] = {0x01,0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}; void SPI_DMA_Slave_SendData(void) { // 1. 配置SPI从机模式 SPI1->CR1 &= ~SPI_CR1_MSTR; // 清除主机模式位 // 2. 配置DMA DMA1_Stream3->CR &= ~DMA_SxCR_EN; // 关闭DMA传输 DMA1_Stream3->PAR = (uint32_t)(&(SPI1->DR)); // 设置外设地址为SPI数据寄存器地址 DMA1_Stream3->M0AR = (uint32_t)txBuffer; // 设置内存地址为发送缓冲区地址 DMA1_Stream3->NDTR = BUFFER_SIZE; // 设置数据长度 DMA1_Stream3->CR |= DMA_SxCR_DIR_0; // 设置DMA传输方向为内存到外设 DMA1_Stream3->CR |= DMA_SxCR_CHSEL_0 | DMA_SxCR_CHSEL_1; // 设置DMA通道为通道0 DMA1_Stream3->CR |= DMA_SxCR_MINC; // 使能内存增量模式 DMA1_Stream3->CR &= ~DMA_SxCR_PINC; // 禁用外设增量模式 DMA1_Stream3->CR |= DMA_SxCR_TCIE; // 使能传输完成中断 // 3. 配置NVIC NVIC_SetPriority(DMA1_Stream3_IRQn, 0); // 设置DMA中断优先级为最高 NVIC_EnableIRQ(DMA1_Stream3_IRQn); // 使能DMA中断 // 4. 启动DMA传输 DMA1_Stream3->CR |= DMA_SxCR_EN; // 打开DMA传输 // 5. 启动SPI从机 SPI1->CR1 |= SPI_CR1_SPE; // 打开SPI // 6. 等待传输完成 while (!(DMA1->HISR & DMA_HISR_TCIF3)); // 等待传输完成 // 7. 关闭SPI从机 SPI1->CR1 &= ~SPI_CR1_SPE; // 关闭SPI // 8. 清除传输完成标志 DMA1->HIFCR |= DMA_HIFCR_CTCIF3; // 清除传输完成标志 } void DMA1_Stream3_IRQHandler(void) { if (DMA1->HISR & DMA_HISR_TCIF3) { DMA1->HIFCR |= DMA_HIFCR_CTCIF3; // 清除传输完成标志 } } int main(void) { // 初始化SPI和DMA while (1) { // 发送数据 SPI_DMA_Slave_SendData(); } } ``` 这段代码实现了SPI从机通过DMA发送数据。首先,需要配置SPI从机模式,并设置DMA传输的相关参数。然后,启动DMA传输和SPI从机,并等待传输完成。最后,关闭SPI从机并清除传输完成标志。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值