您的位置:首页 > 其它

nRF24LE1 串口调试成功 发送数据包

2011-09-29 08:52 316 查看
写了这么久程序,都没有分享点,今天分享点最基础实用的,还望大家指教

以0x55起始 0xDD结尾 的数据包

#include <Nordic\reg24le1.h>

#include <intrins.h>

#include <stdint.h>

#define PIN32

#ifdef PIN32

//定义I/O口方向

#define p0dir 0xf0

#define p1dir 0xff

#endif

#define INTERRUPT_UART0 4 // UART0, Receive & Transmitt interrupt

#define TX_PLOAD_WIDTH 30 // 数据包长度为30 bytes

uint8_t uart_rx[TX_PLOAD_WIDTH];

uint8_t uart_rx_cnt=0; //用于uart_rx数组计数

uint8_t recdat=0; //缓存串口接收到的字节

uint8_t state=0; //串口接收状态机

uint8_t uart_flag=0; //串口接收完一帧数据的标志位

uint8_t len_cnt=0; //存储数据包里面规定的数据长度

/**************************************************

功能:串口中断服务程序

**************************************************/

void UART0_ISR(void) interrupt INTERRUPT_UART0

{

// uint8_t xorchm=0; //存储异或校验

if(RI0 == 1)

{

recdat=S0BUF;

if(state == 0) //串口接收到的第一个字节 检测帧头

{

if(recdat == 0x55) //检测到帧头 状态机进入下一歩

{

state=1;

}

else

state=0;

}

else if(state == 1)

{

len_cnt=recdat;

state=2;

}

else if(state == 2) //存储数据

{

uart_rx[uart_rx_cnt++]=recdat; //数据保存

// xorchm ^= recdat;

if(uart_rx_cnt == len_cnt)

{

state = 3; //数据接收完

uart_rx_cnt=0;

}

else

state=2;

}

/* else if(state == 3) //异或校验

{

if(xorchm == recdat)

{

state = 4;

}

else

state=0;

} */

else if(state == 3) //数据接收正确 检验数据帧尾

{

if(recdat == 0xDD)

{

uart_flag=1;

state = 0;

}

}

RI0 = 0;

}

}

/**************************************************

功能:串口初始化子程序

说明:波特率19.2K,使用内部波特率发生器

**************************************************/

void uart_init(void)

{

ES0 = 0; // 关UART0中断

REN0 = 1; // 允许接收

SM0 = 0; // 串口模式1,8bit可变波特率

SM1 = 1;

PCON |= 0x80; // SMOD = 1

ADCON |= 0x80; // 选择内部波特率发生器

S0RELL = 0xe6; // 波特率19.2K(十进制998=十六进制0x03e6)

S0RELH = 0x03;

TI0 = 0; // 清发送完成标志

RI0 = 0;

S0BUF=0x99; // 送初值

}

/**************************************************

功能:向串口发送1 byte数据

**************************************************/

void uart_putchar(uint8_t x)

{

while (!TI0); // 等待发送完成

TI0=0; // 清发送完成标志

S0BUF=x; // 发送数据

}

/**************************************************

功能:向串口发送一个字符串

**************************************************/

void uart_puts(int8_t *s)

{

while(*s!='\0')

{

uart_putchar(*s);

s++;

}

}

/**************************************************

功能:I/O口初始化

**************************************************/

void io_init(void)

{

P0DIR = p0dir; // 设定I/O口输入输出

P1DIR = p1dir;

}

void main()

{

uint8_t temp=0,num=0,i;

io_init();

uart_init();

uart_puts("\r\nHello!");

EA=1; //允许中断

ES0=1;

while(1)

{

if(uart_flag == 1) //如果收到一桢数据

{

uart_flag = 0;

for(i=0;i<len_cnt;i++)

{

uart_putchar(uart_rx[i]);

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐