nRF52笔记(13)软件模拟spi 4种模式

转载地址

在这里插入图片描述

2 .h文件

#define SET_GPIO(A)   NRF_GPIO->OUTSET = (1UL << (A)) 
#define CLEAR_GPIO(A) NRF_GPIO->OUTCLR = (1UL << (A))
#define READ_GPIO(A)   NRF_GPIO->IN&(1<<(A))
#define OUTPUT_GPIO(A) nrf_gpio_cfg_output(A)
#define INPUT_GPIO(A) nrf_gpio_cfg_input(A,NRF_GPIO_PIN_NOPULL)


2 .c文件

static void hal_spi_init (void) 
{

	OUTPUT_GPIO(LORA_NSS_PIN);
	OUTPUT_GPIO(LORA_SCK_PIN);
	OUTPUT_GPIO(LORA_MOSI_PIN);
	INPUT_GPIO(LORA_MISO_PIN);
    OUTPUT_GPIO(LORA_NRST_PIN);
	INPUT_GPIO(LORA_BUSY_PIN);
	
	CLEAR_GPIO(LORA_SCK_PIN);
}

void hal_spi_select (int on)
{
if(on==0)
{
SET_GPIO(LORA_NSS_PIN);
}else
{
CLEAR_GPIO(LORA_NSS_PIN);
}

}
// perform SPI transaction with radio
u1_t hal_spi (u1_t out) 
{
	
	#define CPHA 0
	#define CPOL 0
	u1_t dataValue=0,i,wr_data;;

	
	wr_data=out;

		
	#if CPHA==0 && CPOL ==0
	for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
	{
		if(wr_data&0x80)
		{
		SET_GPIO(LORA_MOSI_PIN) ;
		}else
		{
		CLEAR_GPIO(LORA_MOSI_PIN);
		}
		SET_GPIO(LORA_SCK_PIN);
        wr_data<<=1;
		dataValue<<=1;
		if(READ_GPIO(LORA_MISO_PIN)) 
		dataValue|=0x01;
		CLEAR_GPIO(LORA_SCK_PIN);
		__NOP();
	}
	#elif #if CPHA==0 && CPOL ==1
	for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
	{
		if(wr_data&0x80)
		{
		SET_GPIO(LORA_MOSI_PIN) ;
		}else
		{
		CLEAR_GPIO(LORA_MOSI_PIN);
		}
		CLEAR_GPIO(LORA_SCK_PIN);
        wr_data<<=1;
		dataValue<<=1;
		if(READ_GPIO(LORA_MISO_PIN)) 
		dataValue|=0x01;
		SET_GPIO(LORA_SCK_PIN);
		__NOP();
	}
	#elif #if CPHA==1 && CPOL ==0
		
		for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
		{
			SET_GPIO(LORA_SCK_PIN);
			if(wr_data&0x80)
			{
			SET_GPIO(LORA_MOSI_PIN) ;
			}else
			{
			CLEAR_GPIO(LORA_MOSI_PIN);
			}
		   CLEAR_GPIO(LORA_SCK_PIN);
			wr_data<<=1;
			dataValue<<=1;
			if(READ_GPIO(LORA_MISO_PIN)) 
			dataValue|=0x01;
		}
		#elif #if CPHA==1 && CPOL ==1
		
		for(i=0;i<8;i++)//以MSB方式按位接收一个字节数据,上升沿一位数据被存入移位寄存器
		{
			CLEAR_GPIO(LORA_SCK_PIN);
			if(wr_data&0x80)
			{
			SET_GPIO(LORA_MOSI_PIN) ;
			}else
			{
			CLEAR_GPIO(LORA_MOSI_PIN);
			}
			SET_GPIO(LORA_SCK_PIN);
			wr_data<<=1;
			dataValue<<=1;
			if(READ_GPIO(LORA_MISO_PIN)) 
			dataValue|=0x01;
	
		}
		#endif
		

	return dataValue;
}



可以加入QQ群:687360507
与大伙沟通交流,技术在于分享而进步

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值