SPI基础函数模版(STM32F1标准库)

/********************************End of Head************************************/
#include "NRF24L01.h"
#include "stm32f10x.h"

#define NFRCS
#define NFRCLK
#define NFRMOSI
#define NFRMISO
#define NFRIRQ
#define NFRCE

 /*
            PB12 PB14   PD8
 (2) 3.3V   CSN  MISO   IRQ
 (1) GND    CE   SCLK2  MOSI
            PD9  PB13   PB15
 */ 
//管脚元素
typedef struct _GPIO
{
   GPIO_TypeDef * GPIO;
   uint16_t       Pin ;  
}GPIO_handle;
//SPI管脚
typedef struct _SPI_Handle
{
   GPIO_handle *CS;
   GPIO_handle *CLK;
   GPIO_handle *MOSI;
   GPIO_handle *MISO;
}SPI_Handle;

#define NRF_CS	GPIOB, GPIO_Pin_12
SPI_Handle SPI_1 =
{
 .CS = {GPIOB,GPIO_Pin_12},//CS
 .CLK= {GPIOB,GPIO_Pin_13},//CLK
 .MOSI={GPIOB,GPIO_Pin_15},//MOSI //输出
 .MISO={GPIOB,GPIO_Pin_14},//MISO //输入
};


#define SimuSPI_CPOL   0 //SCLK==0 是空闲状态,所以有效状态是SCLK等于高电平
#define SimuSPI_CPHA   1 //数据采样是在第2个边沿,数据发送在第1个边沿
//模版SPI发送数据(无CS)
u8 SimuSPIx_RW(SPI_Handle SPI,u8 Wdat)
{
  u8 i=0,m;
  u8 dat = 0;
  for(i=0;i<8;i++)
  {
     #if (SimuSPI_CPHA ==0)
     GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL); 
     {
        //写数据
        if(Wdat&0x80){
            GPIO_SetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
        }else{ 
            GPIO_ResetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
        }
        Wdat<<=1;      
        //读取数据
        dat <<=1; 
        if(SimuSPI_MOSI){
            dat|=0x01;
        }                
     }
     for(m=0;m<10;m++){}
     GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,!SimuSPI_CPOL);    
     #else
     GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL);
     {  //写数据
        if(Wdat&0x80){
            GPIO_SetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
        }else{
            GPIO_ResetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);
        }
        Wdat<<=1;      
     }  
     GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,!SimuSPI_CPOL);     
     {  //读取数据 
        dat <<=1; 
        if(GPIO_ReadInputDataBit(SPI.MISO.GPIO,SPI.MISO.Pin)){
            dat++;
        }
     }  
     for(m=0;m<10;m++){}
     GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL); 
     #endif
  }
  GPIO_WriteBit(SPI.CLK.GPIO ,SPI.CLK.Pin,SimuSPI_CPOL); 
  return dat;
}

//模版SPI初始化管脚
void SPIx_Init(SPI_Handle SPI)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    /*Configure pins: CS */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin   = SPI.CS.Pin ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI.CS.GPIO, &GPIO_InitStructure);
    /*Configure pins: SCK / MISO   */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin  = SPI.CLK.Pin ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI.CLK.GPIO, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin  = SPI.MISO.Pin;
    GPIO_Init(SPI.MISO.GPIO, &GPIO_InitStructure);    
    
    /*Configure SPI1 pins: MOSI*/
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin  = SPI.MOSI.Pin ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SPI.MOSI.GPIO, &GPIO_InitStructure);
    
    GPIO_SetBits(SPI.CS.GPIO  ,SPI.CS.Pin  ); //初始片选电平
    GPIO_SetBits(SPI.CLK.GPIO ,SPI.CLK.Pin ); 
    GPIO_SetBits(SPI.MOSI.GPIO,SPI.MOSI.Pin);      
    SimuSPIx_RW(SPI,0xFF);	                  //启动传输
}
//******************************************************************************
//SPI转换输出
u8 NRF_SPI_WR(u8 dat)
{ 
    return SimuSPIx_RW(SPI_1,dat);//启动传输 
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值