⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.c

📁 NRF24L01 收发通讯程序例子 NRF24L01 收发通讯程序例子
💻 C
字号:

#include "NRF24L01.h"

#define  UART_BPS   9600         //波特率




void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<5000; i++);
}


void UART0_Init(void)
{
	uint16 Fdiv;
	
	U0LCR = 0x83;						// DLAB=1,允许设置串口波特率
	Fdiv  = (Fpclk / 16) / UART_BPS;	// 设置波特率
	U0DLM = Fdiv / 256;
	U0DLL = Fdiv % 256;
	U0LCR = 0x03;              
}      


void UART0_SendStr(uint8 const *str)    //向串口发1字符串数据
{
	while (1)
	{
	if (*str == '\0')	break;	
	UART0_SendByte(*str++);		
	}
}
	 	     	
void UART0_SendByte(uint8 dat)      //向串口发1字符数据
{
	U0THR = dat;
	while ((U0LSR & 0x40) == 0);	
}


void  SPI0_Init(void)
{  
//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500;	// 设置管脚连接SPI
//PINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;
    SPCCR = 0x08;		            // 设置SPI0时钟分频
 	SPCR  = (1 << 3) |		        // CPHA = 0, 数据在SCK 的第一个时钟沿采样
 			(1 << 4) |				// CPOL = 1, SCK 为低有效
 			(1 << 5) |				// MSTR = 1, SPI 处于主模式
 			(0 << 6) |				// LSBF = 0, SPI 数据传输MSB (位7)在先
 			(0 << 7);				// SPIE = 0, SPI 中断被禁止
}

void  SPI1_Init(void)
{
    SSPCR0 = (0x01 << 8) |              // SCR  设置SPI时钟分频
             (0x00 << 7) |              // CPHA 时钟输出相位,仅SPI模式有效 
             (0x01 << 6) |              // CPOL 时钟输出极性,仅SPI模式有效
             (0x00 << 4) |              // FRF  帧格式 00=SPI,01=SSI,10=Microwire,11=保留
             (0x07 << 0);               // DSS  数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位

    SSPCR1 = (0x00 << 3) |              // SOD  从机输出禁能,1=禁止,0=允许
             (0x00 << 2) |              // MS   主从选择,0=主机,1=从机
             (0x01 << 1) |              // SSE  SSP使能,1=允许SSP与其它设备通信
             (0x00 << 0);               // LBM  回写模式
             
    SSPCPSR = 0x08;                     // PCLK分频值

}


void EINT0_Init(void)
{
	IRQEnable();                       //使能IRQ中断										
	VICIntSelect   = 0x00000000;	   //设置所有中断分配为IRQ中断			
	VICVectCntl0   = 0x20 | 0x0e;	   //分配外部中断0到向量中断0				
	VICVectAddr0   = (uint32)IRQ_Eint0;//设置中断服务程序地址				
	
	EXTMODE = 0x00;					// 设置EINT0为电平触发				   
	EXTPOLAR = 0x00;                // 设置EINT0为低电平触发                
	EXTINT         = 0x01;			// 清除EINT0中断标志					
	VICIntEnable   = 1 << 0x0e;		// 使能EINT0中断					    
}


void EINT1_Init(void)
{
	IRQEnable();                        //使能IRQ中断										
	VICIntSelect   = 0x00000000;	    //设置所有中断分配为IRQ中断			
	VICVectCntl1   = 0x20 | 0x0f;	    //分配外部中断1到向量中断1				
	VICVectAddr1   = (uint32)IRQ_Eint1; //设置中断服务程序地址				
	
	EXTMODE = 0x00;					//设置EINT1为电平触发				    
	EXTPOLAR = 0x00;                //设置EINT1为低电平触发                
	EXTINT         = 0x02;			//清除EINT1中断标志					
	VICIntEnable   = 1 << 0x0f;		//使能EINT1中断	                    				

}


uint8 SPI_SendData(uint8 data)
{  	
    SPI_SPDR = data;
    while( 0 == (SPI_SPSR & 0x80));		// 等待SPIF置位,即等待数据发送完毕
    return(SPI_SPDR);
}



uint8 SPI_send(uint8 send_buf[],uint16 num)
{
	
    uint16 i;
    
	for(i=0;i<num;i++)
	 {
	  SPI_SendData(send_buf[i]);  //发送数据
	 }
		
	return 0;
}



uint8 SPI_ReadData(uint8 data)
{  	

    uint32 tmp;
   
    tmp=SPSR;
    SPINT =0x01;
    //while( 0 == (SPI_SPSR & 0x80));		// 等待SPIF置位
    
    return(SPI_SPDR);
    
}




uint8 SPI_read(uint8 send_buf[],uint16 num)
{

     uint16 i;
    
	for(i=0;i<num;i++)
	 {
	  send_buf[i]=SPI_ReadData(0x00);  //读取数据
	 }
		
	return 0;

}









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -