打印

SPI的TI模式主机程序,采用DMA。

[复制链接]
504|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
香菇选手|  楼主 | 2018-7-6 13:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天下午调试了SPI的TI模式程序。实现主机的发送和接收数据。
#include "spi1.h"
#include "led.h"
#include "dma.h"
#include "exti.h"
#include "delay.h"
#include "string.h"
//以下是SPI模块的初始化代码,配置成主机模式         
//SPI口初始化
//这里针是对SPI1的初始化
SerialBuf1 SPIBuf1;
void SPI1_Init(void)
{  
     u16 tempreg=0;
     RCC->AHB1ENR|=1<<0;     //使能PORTA时钟   
     RCC->APB2ENR|=1<<12;    //SPI1时钟使能
     
     GPIO_Set(GPIOA,0x0F<<4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PA5~7复用功能输出
     GPIO_AF_Set(GPIOA,4,5); //PA5,AF5
     GPIO_AF_Set(GPIOA,5,5); //PA5,AF5
     GPIO_AF_Set(GPIOA,6,5); //PA6,AF5
     GPIO_AF_Set(GPIOA,7,5); //PA7,AF5
   
     //这里只针对SPI口初始化
     RCC->APB2RSTR|=1<<12; //复位SPI11
     RCC->APB2RSTR&=~(1<<12);//停止复位SPI1
     //tempreg|=0<<10;   //全双工模式
     //tempreg|=1<<9;   //软件nss管理
     //tempreg|=1<<8;   
     tempreg|=(1<<2);   //SPI主机 -------------------------------
   
     tempreg|=0<<11;  //8位数据格式 ------------------------------
   
     //tempreg|=1<<1;   //空闲模式下SCK为1 CPOL=1
     //tempreg|=1<<0;   //数据采样从第2个时间边沿开始,CPHA=1  
     //对SPI1属于APB2的外设.时钟频率最大为84Mhz频率.
     //tempreg|=5<<3;   //Fsck=Fpclk1/2    10.5M
     tempreg|=6<<3;   //Fsck=Fpclk1/256 --------------------------
     
     //tempreg|=0<<7;   //MSB First  
     tempreg|=1<<6;     //SPI启动
     
  //  SPI1->CR1=tempreg;  //设置CR1  
  //  SPI1->SR&=~RXNE;
     SPI1->CR2|=0x03;     //TXDMAEN,RXDMAEN
     SPI1->CR2|=1<<4;     //FRF
     SPI1->CR1=tempreg;   //设置CR1
     SPI1->I2SCFGR&=~(1<<11);//选择SPI模式
   
//    MYDMA_Config(DMA2_Stream0,3,(u32)&SPI1->DR,(u32)SPIBuf1.RecBuf,255,DMA_DIR_PeripheralToMemory,NormalMode,Size_Byte);   //
//    DMA2_Stream0->CR|=1<<0;      //开启DMA传输
//    DMA2->LIFCR|=1<<5;
//    MY_NVIC_Init(3,2,DMA2_Stream0_IRQn,2);  //抢占3,子优先级2,组2
//    DMA2_Stream0->CR|=1<<4;  
//    memset(SPIBuf1.SendBuf,0,256);
}  
//SPI1速度设置函数
//SpeedSet:0~7
//SPI速度=fAPB2/2^(SpeedSet+1)
//fAPB2时钟一般为84Mhz
void SPI1_SetSpeed(u8 SpeedSet)
{
  SpeedSet&=0X07;   //限制范围
  SPI1->CR1&=0XFFC7;
  SPI1->CR1|=SpeedSet<<3; //设置SPI1速度  
  SPI1->CR1|=1<<6;   //SPI设备使能   
}
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{      
  while((SPI1->SR&1<<1)==0);  //等待发送区空
  SPI1->DR=TxData;           //发送一个byte  
  while((SPI1->SR&1<<0)==0);  //等待接收完一个byte  
  return SPI1->DR;            //返回收到的数据        
}
void StatusCheck(void)
{
     if(SPIBuf1.TXflage)
     {
        SPIBuf1.Status=TXStatus;
     }
     else if(SPIBuf1.RXflage)
     {
         SPIBuf1.Status=RXStatus;
     }
     else
     {
        SPIBuf1.Status=IDILStatus;
     }      
     
}
void SPI_ReceiveSendByte(u8 num,u8 Data[])
{
     //CS0=0;
     //while(flage==0);
     //flage=0;
     DMA2->LIFCR|=1<<27;
     DMA2_Stream3->CR&=~(1<<0);       //关闭发关DMA传输
     //DMA2->LIFCR|=1<<5;
     //DMA2_Stream0->CR&=~(1<<0);      //关闭接收DMA传输
     //SPIBuf1.TXflage|=1;
     //StatusCheck();
     MYDMA_Config(DMA2_Stream3,3,(u32)&SPI1->DR,(u32)Data,num,MemoryToDMA_DIR_Peripheral,NormalMode,Size_Byte);
     DMA2_Stream3->CR|=1<<0;      //开启DMA传输
     MY_NVIC_Init(3,2,DMA2_Stream3_IRQn,2);  //抢占3,子优先级2,组2
     DMA2_Stream3->CR|=1<<4;

//     MYDMA_Config(DMA2_Stream0,3,(u32)&SPI1->DR,(u32)SPIBuf1.RecBuf,255,DMA_DIR_PeripheralToMemory,NormalMode,Size_Byte);   //
//     DMA2_Stream0->CR|=1<<0;      //开启DMA传输
//     MY_NVIC_Init(3,2,DMA2_Stream0_IRQn,2);  //抢占3,子优先级2,组2
//     DMA2_Stream0->CR|=1<<4;  
     //CS0=1;
}
void DMA2_Stream0_IRQHandler(void)     //RX
{
    if(DMA2->LISR&(1<<5))
   {
    DMA2->LIFCR|=1<<5;
     MYDMA_Enable(DMA2_Stream0,255);
   }
}
void DMA2_Stream3_IRQHandler(void)     //TX
{
    if(DMA2->LISR&(1<<27))
    {
       DMA2->LIFCR|=1<<27;
       CS0=1;
//       if(SPIBuf1.Status==TXStatus)
//       {
//          if(SPIBuf1.TXflage)
//          {
//             SPIBuf1.TXflage=0;
//             if(SPIBuf1.RXflage)
//             {
//                MYDMA_Config(DMA2_Stream0,3,(u32)&SPI1->DR,(u32)SPIBuf1.RecBuf,255,DMA_DIR_PeripheralToMemory,NormalMode,Size_Byte);   //
//                DMA2_Stream0->CR|=1<<0;      //开启DMA传输
//                DMA2->LIFCR|=1<<5;
//                MY_NVIC_Init(3,2,DMA2_Stream0_IRQn,2);  //抢占3,子优先级2,组2
//                DMA2_Stream0->CR|=1<<4;
//                SPI_ReceiveSendByte(255,SPIBuf1.SendBuf);
//                SPIBuf1.Status=RXStatus;
//             }
//             else
//             {
//                SPIBuf1.Status=IDILStatus;
//             }
//          }
//                  
//       }
//       else if(SPIBuf1.Status==RXStatus)
//       {
//           
//       }
//     if(SPIBuf1.RXflage==0)
//    {
//      DMA2_Stream3->CR&=~(1<<0);   //关闭DMA传输
//      SPIBuf1.TXflage&=0xfe;
//    }
//     else
//    {
//     if(SPIBuf1.TXflage==0x81)
//     {
//        SPIBuf1.TXflage&=0xfe;
//        MYDMA_Config(DMA2_Stream3,3,(u32)&SPI1->DR,(u32)SPIBuf1.SendBuf,255,MemoryToDMA_DIR_Peripheral,NormalMode,Size_Byte);
//        DMA2_Stream3->CR|=1<<0;          //开启DMA传输
//        MY_NVIC_Init(3,2,DMA2_Stream3_IRQn,2);  //抢占3,子优先级2,组2
//        DMA2_Stream3->CR|=1<<4;
//     }
//    }
//      SPIBuf1.TXflage=0;
//     LED0=~LED0;
    }
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

450

主题

462

帖子

0

粉丝