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

原创 2016年12月13日 12:17:58


模拟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++;
	}    
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

蓝牙BLE基础:CC2541通信系列之模拟SPI协议

cc2541模拟spi: #define SPI_CS                          P1_4    #define SPI_CLK                      ...
  • liwei16611
  • liwei16611
  • 2017年06月18日 12:17
  • 666

nRF51822使用Timer制作4路PWM波详解

Date:2015.5.8 Author:杨正  QQ:1209758756  一、            pwm简介 PWM英文名叫Pulse Width Modulation,中文名叫脉宽调制...
  • u010979030
  • u010979030
  • 2015年05月08日 17:03
  • 2828

nrf51822 --- spi 通信

1.目的    nrf51822 spi通信 2.分析     在实际应用中经常要用到spi通信,比如度flash 3.平台: 协议栈版本:SDK10.0.0 编译软件:keil 5.12 ...
  • a369000753
  • a369000753
  • 2016年05月10日 19:31
  • 5592

蓝牙模块测试

蓝牙测试 宗旨:技术的学习是有限的,分享的精神的无限的。 1、发送AT,回复OK,连接成功 2、先发送 AT+BTPOWER=1;打开蓝牙功能,回复OK 3、发送AT+BT...
  • a1314521531
  • a1314521531
  • 2016年04月24日 22:46
  • 800

nrf51822蓝牙SPI对microSD卡读写

基于nrf51822 SDK10的蓝牙串口工程 ,增加SPI的资源文件到工程,定义SPI0使能,以及定义IO口,和CS引脚电平,新建drv_sd_api.c文件如下即可在主函数调用接口函数对SD卡进行...
  • sinat_23338865
  • sinat_23338865
  • 2016年11月08日 16:57
  • 1598

nRF51822 SPI 驱动 ADXL362

硬件平台:微雪nRF51822开发板 软件平台:MDK522 SDK版本:SDK5 nRF51822的任意管脚可以配置成SPI的管脚,其官方给的代码有一个SPI_master,里面只有两...
  • shepinfangdaqi
  • shepinfangdaqi
  • 2017年03月18日 14:39
  • 1573

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

写入时序图: .h文件 #include "nrf_gpio.h" #include "pca10028.h" #define SPI_MOSI_HIGH nrf_gpio_pin_s...
  • sinat_23338865
  • sinat_23338865
  • 2016年12月13日 12:17
  • 1041

nrf51822使用LIS3DH计步算法库

  • 2017年05月30日 16:40
  • 1.54MB
  • 下载

嵌入式学习--work11 关于SPI的深入学习及软件模拟SPI(LCD调试所遇)

在调试液晶LCD时,LCD是某清洋实业公司生产,在其液晶显示模块规格书里,描述了尺寸为 1.22 inch,接口类型为 SPI 3Line2Lane Interface,SPI为三线两通道的SPI,液...
  • wangwangmoon_light
  • wangwangmoon_light
  • 2016年11月12日 22:00
  • 1503

stm32 io模拟spi通信

首先借鉴他人的编写程序: #define MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_10) #define MOSI_L GPIO_ResetBits(GPIOB, ...
  • ztshun
  • ztshun
  • 2016年05月06日 16:54
  • 861
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:nrf51822蓝牙之软件模拟spi各种模式
举报原因:
原因补充:

(最多只允许输入30个字)