📄 io.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 + -