您的位置 首页 IOT

STM32的SPI选用DMA方法传输测验

环境:主机:WIN7开发环境:MDK4.23MCU:STM32F103CBT6说明:参考链接:http://www.openedv.com/posts/list/3159.htmSPI传输数据分为连续

环境:

主机:WIN7

开发环境:MDK4.23

MCU:STM32F103CBT6

阐明:

参阅链接:http://www.openedv.com/posts/list/3159.htm

SPI传输数据分为接连传输和非接连传输.

接连传输时序图:

非接连传输时序图:

非接连传输形式可以参阅上篇文章:http://blog.csdn.net/jdh99/article/details/7598573

官方pdf关于接连和非接连传输的阐明:
当在主形式下发送数据时,假如软件足够快,可以在检测到每次TXE的上升沿(或TXE中止),并立即在正在进行的传输完毕之前写入SPI_DR寄存器,则可以完成接连的通讯;此刻,在每个数据项的传输之间的SPI时钟坚持接连,一起BSY位不会被铲除。

简而言之,便是要及时监测TXE.在SPI在1M以上波特率传输时,传输一位时刻为1us,导致软件不能及时判别,此刻可以用dma的方法来进行SPI传输.

源代码:

装备:

#define buffersize 512#define SPI1_DR_Addr ( (u32)0x4001300C )extern uint8_t SPI1_TX_Buff[buffersize];extern uint8_t SPI1_RX_Buff[buffersize];

void SPI1_DMA_Configuration( void ){RCC->AHBENR |= 1<<0 ;                     //DMA1时钟使能/*------------------装备SPI1_RX_DMA通道Channel2---------------------*/DMA1_Channel2->CCR &= ~( 1<<14 ) ;        //非存储器到存储器形式DMA1_Channel2->CCR |=    2<<12   ;        //通道优先级高DMA1_Channel2->CCR &= ~( 3<<10 ) ;        //存储器数据宽度8bitDMA1_Channel2->CCR &= ~( 3<<8  ) ;        //外设数据宽度8bitDMA1_Channel2->CCR |=    1<<7    ;        //存储器地址增量形式DMA1_Channel2->CCR &= ~( 1<<6  ) ;        //不碑文外设地址增量形式DMA1_Channel2->CCR &= ~( 1<<5  ) ;        //碑文循环操作DMA1_Channel2->CCR &= ~( 1<<4  ) ;        //从外设读DMA1_Channel2->CNDTR &= 0x0000   ;        //传输数量寄存器清零DMA1_Channel2->CNDTR = buffersize ;       //传输数量设置为buffersize个DMA1_Channel2->CPAR = SPI1_DR_Addr ;      //设置外设地址,留意PSIZEDMA1_Channel2->CMAR = (u32)SPI1_RX_Buff ; //设置DMA存储器地址,留意MSIZE/*------------------装备SPI1_TX_DMA通道Channel3---------------------*/DMA1_Channel3->CCR &= ~( 1<<14 ) ;        //非存储器到存储器形式DMA1_Channel3->CCR |=    0<<12   ;        //通道优先级最低DMA1_Channel3->CCR &= ~( 3<<10 ) ;        //存储器数据宽度8bitDMA1_Channel3->CCR &= ~( 3<<8 )  ;        //外设数据宽度8bitDMA1_Channel3->CCR |=    1<<7    ;        //存储器地址增量形式DMA1_Channel3->CCR &= ~( 1<<6 )  ;        //不碑文外设地址增量形式DMA1_Channel3->CCR &= ~( 1<<5 ) ;         //不碑文循环操作DMA1_Channel3->CCR |=    1<<4    ;        //从存储器读DMA1_Channel3->CNDTR &= 0x0000   ;        //传输数量寄存器清零DMA1_Channel3->CNDTR = buffersize ;       //传输数量设置为buffersize个DMA1_Channel3->CPAR = SPI1_DR_Addr ;      //设置外设地址,留意PSIZEDMA1_Channel3->CMAR = (uint32_t)SPI1_TX_Buff ; //设置DMA存储器地址,留意MSIZE				 }

接纳与发送:

void SPI1_ReceiveSendByte( u16 num ){DMA1_Channel2->CNDTR = 0x0000   ;           //传输数量寄存器清零DMA1_Channel2->CNDTR = num ;         //传输数量设置为buffersize个DMA1_Channel3->CNDTR = 0x0000   ;           //传输数量寄存器清零DMA1_Channel3->CNDTR = num ;         //传输数量设置为buffersize个DMA1->IFCR = 0xF0 ;                         //铲除通道2的标志位DMA1->IFCR = 0xF00 ;                        //铲除通道3的标志位SPI1->DR ;									//接送前读一次SPI1->DR,确保接纳缓冲区为空while( ( SPI1->SR & 0x02 ) == 0 );DMA1_Channel3->CCR |= 1 << 0 ;              //舱位DMA通道3DMA1_Channel2->CCR |= 1 << 0 ;              //舱位DMA通道2	while( ( DMA1->ISR & 0x20 ) == 0 );DMA1_Channel3->CCR &= ~( 1 << 0 ) ;         //封闭DMA通道3DMA1_Channel2->CCR &= ~( 1 << 0 ) ;         //封闭DMA通道2}
//SPI发送一个字节static uint8 SPI_SendByte(uint8 Data){#ifndef SPI_DMA// Loop while DR register in not empltywhile( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_TXE ) == RESET ) ;// Send byte through the SPI1 peripheralSPI_I2S_SendData( SPI1, Data ) ;// Wait to receive a bytewhile( SPI_I2S_GetFlagStatus( SPI1, SPI_I2S_FLAG_RXNE ) == RESET ) ;// Return the byte read from the SPI busreturn SPI_I2S_ReceiveData( SPI1 ) ;#elseSPI1_TX_Buff[0] = Data;SPI1_ReceiveSendByte(1);return (SPI1_RX_Buff[0]);#endif}//SPI读取Len字节void SPI_ReadBytes( uint8 Addr, NtrxBufferPtr Buffer, uint8 Len ){#ifndef SPI_DMAif( ( Len > 0x80 ) || ( Len == 0 ) )Len = 1 ;SPI_SendByte( Len ) ;SPI_SendByte( Addr ) ;while( Len-- ){*Buffer = SPI_SendByte( 0xFF ) ;Buffer ++ ;}#elseuint8 i = 0;if( ( Len > 0x80 ) || ( Len == 0 ) )Len = 1 ;SPI1_TX_Buff[0] = Len;SPI1_TX_Buff[1] = Addr;SPI1_ReceiveSendByte(Len + 2);for (i = 0;i < Len;i++){*Buffer++ = SPI1_RX_Buff[i + 2];	}#endif}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/265317.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部