📄 main.c
字号:
/* 设置FIFO,修改触发深度,需要修改相关I最值 */
//U0FCR = 0x01; // 使能FIFO,并设置FIFO触发深度大小为1个字节
//U0FCR = 0x41; // 使能FIFO,并设置FIFO触发深度大小为4个字节
U0FCR = 0x81; // 使能FIFO,并设置FIFO触发深度大小为8个字节
//U0FCR = 0xc1; // 使能FIFO,并设置FIFO触发深度大小为14个字节
/* 清除接收FIFO内的数据 */
ClrRcvFIFO0();
/* 初始化帧格式 */
U0LCR = 0x83; //bit7=1 DLAB=1 允许设置波特率
Fdiv =(Fpclk/16)/UART0_BPS; //设置波特率
U0DLM =Fdiv/256;
U0DLL =Fdiv%256;
U0LCR = 0x03; //8位字符长度,1停止位,无校验
/* IRQ,FIQ分配*/
VICIntSelect = 0 << UART0_INT;; // 设置串口0中断分配为IRQ中断
/* 初始化UART VIC 中断接口 */
VICIntEnClr |= 1 << UART0_INT;
VICVectPri6 = 0x05;
VICVectAddr6 = (uint32)IRQ_UART0;
VICIntEnable |= 1 << UART0_INT;
IRQEnable(); //打开IRQ中断,IRQ中断使能, .s文件中
/* 读取除数锁存器的值 */
U0LCR = 0x83; // DLAB=1
dlm = U0DLM;
dll = U0DLL;
U0LCR = 0x03;
baud = (Fpclk / (16 * (256 * dlm + dll)));
sprintf(str, "Hello! Uart3's Baud is %4d bps", baud);
UART0_SendStr(str); // 向串口发送字符串
DISP_CHANGEROW0();
/* 清除接收FIFO内的数据 */
ClrRcvFIFO0();
U0IER |= 0x03; //使能RDA和CTI中断 和THRE中断
}
/*********************************************************************************************************
** 函数名称 :UART0_Init
** 函数功能 :令串口0完成全部初始化工作: 波特率 9600
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UART0_set_bps(uint32 uart0_set_bps)
{
//uint32 bak = 0;
uint16 Fdiv =0;
while ((U0LSR & 0x40) == 0); // 等待数据发送完毕
U0IER &= 0xFC; //禁能RDA和CTI中断 和THRE中断
/* 初始化帧格式 */
U0LCR = 0x83; //bit7=1 DLAB=1 允许设置波特率
Fdiv =(Fpclk/16)/uart0_set_bps; //设置波特率
U0DLM =Fdiv/256;
U0DLL =Fdiv%256;
U0LCR = 0x03; //8位字符长度,1停止位,无校验
/* 设置FIFO,修改触发深度,需要修改相关I最值 */
U0FCR = 0x01; // 使能FIFO,并设置FIFO触发深度大小为1个字节
//U0FCR = 0x41; // 使能FIFO,并设置FIFO触发深度大小为4个字节
//U0FCR = 0x81; // 使能FIFO,并设置FIFO触发深度大小为8个字节
//U0FCR = 0xc1; // 使能FIFO,并设置FIFO触发深度大小为14个字节
/* 清除接收FIFO内的数据 */
ClrRcvFIFO0();
U0IER |= 0x03; //使能RDA和CTI中断 和THRE中断
}
/*********************************************************************************************************
** 函数名称 :ZIGBEE_GPIO_INIT
** 函数功能 :以查询方式发送一字节数据
** 入口参数 :dat 要发送的数据
** 出口参数 :无
*********************************************************************************************************/
#define p011 (1<<11)
#define p211 (1<<11)
#define p212 (1<<12)
#define p213 (1<<13)
void ZIGBEE_GPIO_INIT(void)
{
/*
7--CENTER--P0.11,输出,低电平有效,或加跳线帽,成为中心节点,如7、8 都为高电平或悬,
即为路由节点
8--DEVICE--P2.13,输出,低电平有效,或加跳线帽,成为终端节点,如7、8 都为高电平或悬空,即为路由节点
9--CONFIG--P2.12,输出,低电平有效,或加跳线帽,进入系统配置状态
右边6、7、9
6--接用户 232 输入--串口0接收(XCDCT)
7--接用户 232 输出--输出串口0发送(XCDCT)
9--低电平复位、P2.11--输出,低电平有效
*/
//SCS |= 0x01;
PINSEL0 &=0xFF3FFFFF;//CENTER--P0.11,输出
PINSEL4 &=0xF03FFFFF;//DEVICE--P2.13,输出
//CONFIG--P2.12,输出
//复位 --P2.11,输出
IO0DIR |= p011;
FIO2DIR |= p211;
FIO2DIR |= p212;
FIO2DIR |= p213;
/*
//测试,调试成功
IO0SET |= p011;
FIO2SET |= p211;
FIO2SET |= p212;
FIO2SET |= p213;
IO0CLR |= p011;
FIO2CLR |= p211;
FIO2CLR |= p212;
FIO2CLR |= p213;
*/
//根据ZIGBEE配置初始化
IO0CLR |= p011;//ZB_CT
FIO2SET |= p211;//ZB_RESET
FIO2SET |= p212;//ZB_CFG
FIO2SET |= p213;//ZB_DS
}
/*********************************************************************************************************
** 函数名称 :ZIGBEE_INIT
** 函数功能 :ZIGBEE模块初始化
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void ZIGBEE_INIT(void)
{
UART0_Init(); //
ZIGBEE_GPIO_INIT();
}
uint8 idflag=0; // ID号同步标志
uint8 dataflag=0; // 数据同步标志
uint8 sysset_id=0;
uint8 recv_buf_valid=0; // 数据接收标志
uint32 recv_buf_sum=0; // 缓冲区接收数据条数
uint32 recv_lose_sum=0; // 缓冲区丢失数据条数
uint8 recv_ctr=0; // 数据缓冲区指针
uint8 recv_chksum; // 输入数据的校验字节
#define SYNC 0xaa
#define CLOCK_ADDR 0xbb
uint8 datalen=0; //数据长度
uint8 syncflag=0; // 数据同步标志
#define BUF_SIZE 128
uint8 recv_buf[BUF_SIZE]; // 输入数据缓冲区
//函数名称:zigbee_rcv
//函数功能:接收ZIGBEE数据
//入口参数:
//出口参数:
void zigbee_rcv (void)
{
uint8 temp;
if(UART0_getchar(&temp) == FALSE) //查询是否接收到一个字符
return;
if(idflag)
{ //id处理
idflag = 0; //清除idflag
if((dataflag==0)&&(temp == sysset_id))
{
if(recv_buf_valid)
{
recv_buf_sum++;
return;
}
dataflag = 1; //开始接收数据
recv_ctr = 3;
recv_chksum = SYNC+CLOCK_ADDR+sysset_id;
datalen = 8; //最小长度
return;
}
}
if(temp==SYNC) //0xaa
{
syncflag=1; //0xaa同步标志,可能是数据
}
else if(temp==CLOCK_ADDR) //0xbb
{ //0x57同步标志
if(syncflag) idflag = 1; // 接收到aabb,下一字节为ID
syncflag = 0; // 收到非aa字符,标志清0
}
else
{
syncflag=0; //收到非0xaa字符,标志清0
}
if(dataflag)
{
if(recv_ctr==6)
{
datalen = temp ; //真实长度
if((datalen>BUF_SIZE)||(datalen<8))
{
dataflag=0;
return;
}
}
if(recv_ctr!=7) recv_chksum += temp;
recv_buf[recv_ctr++] = temp;
if (recv_ctr == datalen)
{
dataflag = 0; //数据完整收完,标志置位。
recv_ctr=0;
if (recv_chksum== recv_buf[7]) recv_buf_valid=1;
else recv_lose_sum++;
}
}
}
/*********************************************************************************************************
** 函数名称 :UART2_TEST()
** 函数功能 :串口2函数测试程序
** 入口参数 :无
** 出口参数 :无
*********************************************************************************************************/
void UART0_TEST(void)
{
/*中断接收再返回上位机*/
uint8 temp;
char str[64];
//uart3_init();
//UART0_set_bps(9600);
if(UART0_getchar(&temp) == FALSE) //查询是否接收到一个字符
return;
tx_buffer0[0]=temp;
//tx_buffer0[0]=UART0_RcvByte();
UART0_putBuf(tx_buffer0, 1);
//DISP_CHANGEROW0();
sprintf(str, "My name is Tian Youlong !!!");
//UART0_SendStr(str); // 向串口发送字符串
//DISP_CHANGEROW0();
}
//函数名称:zigbee_into_config
//函数功能:进入配置模式
//入口参数:
//出口参数:
void zigbee_into_config (void)
{
FIO2CLR |= p212;//ZB_CFG
DelayNS(300);
FIO2SET |= p212;//ZB_CFG
}
//函数名称:zigbee_lan_select
//函数功能:语言选择
//入口参数:
//出口参数:
void zigbee_lan_select (void)
{
UART0_putchar(0x02);
}
//函数名称:zigbee_save_code
//函数功能:输入安全码
//入口参数:
//出口参数:
void zigbee_save_code (void)
{
//char str[10];
//sprintf(str, "SHUNCOM");
//UART0_SendStr(str);
UART0_putstr("SHUNCOM");
}
//函数名称:zigbee_read_set
//函数功能:读取参数
//入口参数:
//出口参数:
void zigbee_read_set (void)
{
UART0_putchar(0x0e);
}
//函数名称:main
//函数功能:主函数:实现ZIGBEE自收自发(数据收发)
int main (void)
{
unsigned char temp_buf[128]; //临时缓冲区
ZIGBEE_INIT();
//time0_init();
//蜂鸣器
PINSEL2 &= 0xFFFCFFFF;//连接GPIO功能
IO1DIR |= PIN108;//设置为输出
IO1SET |= PIN108;//设置为输出
//1.设置波特率
UART0_set_bps(38400);
//2.拉低配置引脚,接收相应数据
rx_wr_index0=0;
//rx_counter0=0;
zigbee_into_config();
//while(UART0_RcvByte());
//220
DelayNS(100);
//3.选择语言,接收相应数据
rx_wr_index0=0;
//rx_counter0=0;
zigbee_lan_select();
//while(UART0_RcvByte());
// 25 245
DelayNS(100);
//4.输入安全代码,接收相应数据
rx_wr_index0=0;
//rx_counter0=0;
zigbee_save_code();
DelayNS(100);
//while(UART0_RcvByte());
// 227 472
//5.发送读取参数命令,读取配置参数
rx_wr_index0=0;
//rx_counter0=0;
zigbee_read_set();
//while(UART0_RcvByte());
// 242 714
/*
for (i = 0; i < 1; i++)
{
//status=UCSRA;
data=U0RBR;
//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
//{
if(rx_counter0 < (RX_BUFFER_SIZE0-1))
{
rx_buffer0[rx_wr_index0]=data;
if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
rx_counter0++;
}
*/
while(1)
{
//UART0_TEST();
}
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -