一颗偏执的心

坚持积累、缩小差距、一直走在成为大神的路上、

nrf51822蓝牙之软件模拟spi各种模式


模拟spi首先确定SPI极性:



#define _CPOL     1
#define _CPHA     0
#define SCK_IO    DDRA|=0X01
#define MOSI_IO   DDRA|=0X02
#define MISO_IO   DDRA&=0XFB
#define SSEL_IO   DDRA|=0X08
#define SCK_D(X)   (X?(PORTA|=0X01):(PORTA&=0XFE))
#define MOSI_D(X)  (X?(PORTA|=0X02):(PORTA&=0XFD))
#define SSEL_D(X)  (X?(PORTA|=0X08):(PORTA&=0XF7))

#define MISO_I()  (PINA&0X04)  
void delay()
{
 unsigned char m,n;
     for(n=0;n<5;n++);
    for(m=0;m<100;m++);
}
/************************************************
        端口方向配置  与输出初始化
************************************************/
void SPI_Init(void)
{
SCK_IO   ; 
MOSI_IO  ;
MISO_IO  ; 
SSEL_IO  ;
SSEL_D(1);
MOSI_D(1);
#if _CPOL==0
SCK_D(0);
#else
SCK_D(1);
#endif
}

/**********************************************
模式零           写数据
***********************************************/
#if _CPOL==0&&_CPHA==0          //MODE   0  0   
void SPI_Send_Dat(unsigned char dat)
{
 unsigned char n;
 for(n=0;n<8;n++)
 {
  SCK_D(0);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(1);
 }
  SCK_D(0);
}
/*********************************************
模式零         读数据
*********************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 for(n=0;n<8;n++)
 {
  SCK_D(0);
  dat<<=1;
  if(MISO_I())dat|=0x01;
  else dat&=0xfe;
  SCK_D(1);
 }
  SCK_D(0);
  return dat;
}
#endif
/**********************************************
模式二           写数据
***********************************************/
#if _CPOL==1&&_CPHA==0           //MODE   1  0
void SPI_Send_Dat(unsigned char dat)
{
 unsigned char n;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(0);
 }
  SCK_D(1);
}
/*********************************************
模式二          读数据
*********************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  dat<<=1;
  if(MISO_I())dat|=0x01;
  else dat&=0xfe;
  SCK_D(0);
 }
  SCK_D(1);
  return dat;
}

#endif
/*********************************************
模式一        写数据
*********************************************/
#if _CPOL==0&&_CPHA==1           //MODE  0  1
void SPI_Send_Dat(unsigned char dat)
{
 unsigned char n;
 SCK_D(0);
 for(n=0;n<8;n++)
 {
  SCK_D(1);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(0);
 }
}
/*********************************************
模式一       读数据
*********************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 for(n=0;n<8;n++)
 {
  SCK_D(1);
   dat<<=1;
  if(MISO_I())dat|=0x01;
  else dat&=0xfe;
  SCK_D(0);
 }
  SCK_D(0);
  return dat;
}
#endif
///////////////////////////////////////////////////////
///////////////////////////////////////////////////////

#if _CPOL==1&&_CPHA==1            //MODE  1  1
void SPI_Send_Dat(unsigned char dat)
{
 unsigned char n;
 SCK_D(1);
 for(n=0;n<8;n++)
 {
  SCK_D(0);
  if(dat&0x80)MOSI_D(1);
  else MOSI_D(0);
  dat<<=1;
  SCK_D(1);
 }
}
/************************************
模式三          读数据
************************************/
unsigned char SPI_Receiver_Dat(void)
{
 unsigned char n ,dat,bit_t;
 SCK_D(0);
 for(n=0;n<8;n++)
 { SCK_D(0);
  dat<<=1;
  if(MISO_I())dat|=0x01;
  else dat&=0xfe;
  SCK_D(1);
 }
  SCK_D(1);
  return dat;
}
#endif
/*************************************
*************************************/
void main()
{

SPI_Init();
DDRB = 0XFF;
//#if _CPOL
//SCK_D(0);
//#endif
while(1)
{
//SSEL_D(0);
//SPI_Send_Dat(0x01);
//SPI_Send_Dat(0x31);
//SSEL_D(1);
SSEL_D(0);
SPI_Send_Dat(0x81);
PORTB =SPI_Receiver_Dat();
SSEL_D(1);
//delay();
}
}


写入时序图:



.h文件

#include "nrf_gpio.h"
#include "pca10028.h"

#define SPI_MOSI_HIGH    nrf_gpio_pin_set(SPIM0_MOSI_PIN)
#define SPI_MOSI_LOW     nrf_gpio_pin_clear(SPIM0_MOSI_PIN)

#define SPI_CLK_HIGH     nrf_gpio_pin_set(SPIM0_SCK_PIN)
#define SPI_CLK_LOW      nrf_gpio_pin_clear(SPIM0_SCK_PIN)

#define EN_SELECT_CS   nrf_gpio_pin_clear(SPIM0_SS_PIN)
#define DIS_SELECT_CS    nrf_gpio_pin_set(SPIM0_SS_PIN)

#define SPI_DATA_GET     nrf_gpio_pin_read(SPIM0_MISO_PIN)



void SpiSent_1Byte(unsigned char dat);
void SpiSentByte(uint8_t *write,uint8_t len);
void SpiReadByte(uint8_t *read, uint8_t len);
void GPIO_Spi_init(void);



.c文件关键函数

void GPIO_Spi_init(void)
{
    nrf_gpio_cfg_input(SPIM0_MISO_PIN, NRF_GPIO_PIN_PULLUP);
    nrf_gpio_cfg_output(SPIM0_SCK_PIN);
    nrf_gpio_cfg_output(SPIM0_SS_PIN);
    nrf_gpio_cfg_output(SPIM0_MOSI_PIN);  
    SPI_CLK_LOW;
    DIS_SELECT_CS;
    SPI_MOSI_HIGH;

}


void SpiSent_1Byte(uint8_t dat)
{

	unsigned char temp1[8]={0x80, 0x40, 0x20, 0x10, 0x08, 0x04,0x02,0x01};
	unsigned char tlen = 0;


		for(tlen=0; tlen<8; tlen++)
		{
			SPI_CLK_LOW;
           
			if(dat & temp1[tlen])
            SPI_MOSI_HIGH;
                
			else
            SPI_MOSI_LOW;
           
			SPI_CLK_HIGH;
		}
        SPI_CLK_LOW;
}

void SpiSentByte(uint8_t *write,uint8_t len)
{
	unsigned char temp1[8]={0x80, 0x40, 0x20, 0x10, 0x08, 0x04,0x02,0x01},count=0;
	uint8_t tlen = 0;
	
	while(tlen < len)
	{

		for(count=0; count<8; count++)
		{
			SPI_CLK_LOW;
			if(write[tlen] & temp1[count])
				SPI_MOSI_HIGH;
			else
				SPI_MOSI_LOW;   
			SPI_CLK_HIGH;
		}
		tlen++; 
     SPI_CLK_LOW;        
	}
 
}

void SpiReadByte(uint8_t *read, uint8_t len)
{

	unsigned char temp=0,count=0;
	
	uint8_t tlen = 0;
	while(tlen < len)
	{   
		temp = 0x00;
		for(count=0; count<8; count++)
		{
			temp = temp<<1;
			SPI_CLK_LOW;
			if((SPI_DATA_GET ==1))
				temp |= 0x01;
			SPI_CLK_HIGH;

		}
    SPI_CLK_LOW;    
    read[tlen] = temp & 0xff;
    tlen++;
	}    
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_23338865/article/details/53608245
个人分类: nrf51822蓝牙开发
想对作者说点什么? 我来说一句

NRF51822 SPI 模拟

2018年03月18日 2KB 下载

nRF51822 蓝牙串口带加密例程

2015年10月14日 2.65MB 下载

没有更多推荐了,返回首页

不良信息举报

nrf51822蓝牙之软件模拟spi各种模式

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭