📄 main.c.bak
字号:
#include "lpc2136config.h"
#include "type.h"
enum command_type
{
//读写器控制类指令
CMD_SET_BAUT_RATE=0x01, // 设置读写器串口波特率
CMD_GET_VERSION, // 获得读写器版本号
CMD_SET_RELAY, // 控制继电器
CMD_SET_OUTPUT_POWER, // 设置读写器射频输出功率
CMD_SET_FREQUENCY, // 设置读写器射频频率
CMD_READ_PARAMETER, // 获得读写器工作参数
CMD_SET_MOD_DEEPTH, // 设置读写器调制深度
CMD_GET_MOD_DEEPTH, // 获得读写器调制深度
CMD_SET_OPERATION_PARAMETER, // 设置读写器工作参数
CMD_SET_ANTENNA, // 选择天线
CMD_GET_JAMMING, // 获得外部射频干扰值
CMD_SET_DEFAULT_PARAMETER, // 设置读写器出厂参数
CMD_COPY_DEFAULT_PARAMETER, // 恢复读写器出厂参数
CMD_REBOOT, // 复位读写器
CMD_SET_ANTENNA_NUM=0x85, // 设置读写器天线数
CMD_SET_FREQUENCY_CH, // 设置读写器频道数
//授权指令
CMD_WRITE_MAC=0x40, // 写厂商授权码
CMD_READ_MAC, // 获得厂商授权码
CMD_WRITE_UAC, // 写用户授权码
CMD_READ_UAC, // 获得用户授权码
CMD_AUTHORIZE_TAG, // 授权标签
CMD_CHECK_AUTHORIZE_TAG, // 验证标签授权状态
CMD_SET_AUTHORIZATION, // 设置读写器授权功能
CMD_GET_AUTHORIZATION, // 获得读写器授权功能
//读写EM公司标签指令
EM_GETLOCK=0xC9, // 获得标签写保护状态
EM_SETLOCK, // 设置标签写保护
EM_WRITEPAGEBLOCK, // 写标签数据
EM_READPAGEBLOCK, // 读标签数据
EM_LISTIDREPORT, // 获得已读标签ID
EM_LISTID, // 识别标签ID
//读写EPC C1G2标签指令
EPC1G2_EASALARM=0xE4, // 获得标签报警状态
EPC1G2_CHANGEEAS, // 设置标签报警状态
EPC1G2_BLOCKLOCK, // 设置标签数据块写保护
EPC1G2_WRITEEPC, // 写标签EPC码
EPC1G2_KILLTAG, // 毁灭标签
EPC1G2_NA,
EPC1G2_SETLOCK, // 设置标签写保护
EPC1G2_WRITEDATA, // 写标签数据
EPC1G2_READDATA, // 读标签数据
EPC1G2_REPORTID, // 获得已读标签ID
EPC1G2_LISTID, // 识别标签ID
//读写ISO18000-6B标签指令
ISO6B_GETLOCK=0xF3, // 获得标签写保护状态
ISO6B_SETLOCK, // 设置标签写保护
ISO6B_WRITEDATA, // 写标签数据
ISO6B_READDATA, // 读标签数据
ISO6B_READSELECTID=0xFB, // 有条件识别标签ID
ISO6B_REPORTID=0xFD, // 获得已读标签ID
ISO6B_LISTID=0XFE // 无条件识别标签ID
};
//volatile uint8 rcv_buf[40]; // UART0数据接收缓冲区
//volatile uint8 rcv_new; // 接收新数据标志
//volatile uint32 rcv_num;
volatile uint8 command_buffer[48];
volatile uint8 data_result[252]; // 长度为FF最多冲坏待发送区域
volatile uint8 usart0_receive_num; // 串口0当前接收数据数目 新加
volatile uint8 usart0_receive_len; // 串口0接收数据长度 新加
volatile uint8 usart0_send_len; // 串口0发送数据长度
volatile uint8 usart0_signal_flags; // 串口0的通讯标识
volatile uint32 usart0_timer_base; // 串口0接收间隔计时 新加
#define usart0_timer_over_value 200 // 串口0超时参数10us*200=2ms
#define usart0_receiving_set usart0_signal_flags|=0x01 // 串口0正在接收数据
#define usart0_receive_ok_set usart0_signal_flags|=0x02 // 串口0接收完数据
#define usart0_received_len_set usart0_signal_flags|=0x04 // 串口0已收到数据包长度字节 没用
#define usart0_r_timer_over_set usart0_signal_flags|=0x08 // 串口0接收超时 没用
#define usart0_sending_set usart0_signal_flags|=0x10 // 串口0正在发送数据
#define usart0_receive_boot_set usart0_signal_flags|=0x20 // 串口0收到帧头 新加
#define usart0_receive_boot usart0_signal_flags&0x20 // 检查帧头
#define usart0_receive_ok usart0_signal_flags&0x02 // 检查收完数据
#define usart0_receiving usart0_signal_flags&0x01 // 检查正在接收数据
/*
#define usart0_receiving_clr usart0_signal_flags&=0xfe // 复位串口0正在接收数据
#define usart0_receive_ok_clr usart0_signal_flags&=0xfd // 复位串口0接收完数据
#define usart0_received_len_clr usart0_signal_flags&=0xfb // 复位串口0已收到数据包长度字节
#define usart0_r_timer_over_clr usart0_signal_flags&=0xf7 // 复位串口0接收超时
#define usart0_sending_clr usart0_signal_flags&=0xef // 复位串口0正在发送数据
*/
#define RECEIVE_BOOT_CODE 0x40 // 上位机指令包帧头
#define SEND_OK_BOOT_CODE 0xF0 // 读写器执行成功包帧头
#define SEND_FAIL_BOOT_CODE 0xF4 // 读写器执行失败包帧头
uint32 sendbit[20];
uint32 viewtemp;
volatile uint32 powerdown;
void SendDataTest(void);
void CapDataTest(void);
void DAC_Test(void);
uint32 ADC_Test(void);
uint32 analyse_receive_data(void);
void __irq IRQ_UART0(void)
{
uint32 receivebuf,uartiir;
usart0_timer_base=T1TC; // 每次中断重新送时间基值
uartiir=U0IIR&0x0f; // 取得中断标志
if (uartiir==0x04) // 接收到数据标志
{
receivebuf=U0RBR; // 读到临时变量
if (usart0_receive_boot) // 已经收到帧头
{
command_buffer[usart0_receive_num]=receivebuf;
if (usart0_receive_num==0) // 接收的是长度
usart0_receive_len=receivebuf;
else // 接收的是数据及校验
{
if (usart0_receive_num==usart0_receive_len)
usart0_receive_ok_set; // 接收数据完成
}
++usart0_receive_num;
}
else // 帧头还没收到
{
if (receivebuf==RECEIVE_BOOT_CODE) // 是帧头
{
usart0_receive_boot_set; // 置位帧头标志
usart0_receive_num=0; // 初始化接收指针
usart0_receiving_set; // 置位正在接收数据
}
}
}
VICVectAddr = 0x00; // 中断处理结束
}
__inline void interrupt_config(void)
{
IRQEnable(); // 使能IRQ中断
VICIntSelect=0x00000000; // 设置所有的通道为IRQ中断
VICVectCntl0=0x20|06; // UART0分配到IRQ slot0,即最高优先级
VICVectAddr0=(uint32)IRQ_UART0; // 设置UART0向量地址
VICIntEnable=1<<06; // 使能UART0
}
__inline void usart0_config(void)
{
uint32 Fdiv;
U0LCR=0x83; /* 8 bits, no Parity, 1 Stop bit */
Fdiv=(Fpclk/16)/115200 ; /*baud rate */
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03; /* DLAB = 0 */
U0FCR=0x07; /* Enable and reset */
U0IER = 0x01; // 允许RBR中断,即接收中断
usart0_signal_flags=0; // 清空标志
}
void UARTSend(uint8 *BufferPtr, uint32 Length )
{
while (Length!=0)
{
while ((U0LSR&0x20)==0x20)
{
U0THR=*BufferPtr;
BufferPtr++;
Length--;
}
}
}
__inline void EnableIRQ(void)
{
int tmp;
__asm
{
MRS tmp, CPSR
BIC tmp, tmp, #0x80
MSR CPSR_c, tmp
}
}
__inline void pwm_config(void)
{
PWMTCR=0x00000002; /* Counter Reset */
PWMPR=27; /* count frequency:Fpclk */
PWMMCR=0x00; //不使用中断
PWMMR0=1000; /* set PWM cycle */
PWMMR5=350;
PWMLER=0x20;
PWMPCR=0x2000;
PWMTCR=0x00000009; /* counter enable, PWM enable */
}
__inline void port_config(void)
{
IODIR=0x00B00C04; // 0000 0000
// 1011 0000 P022 P020 P019 输出
// 0000 1100 P011 P010 输出
// 0000 0100 P002 输出
IO1DIR=0x00000000; // 目前全做输入
PINSEL0=0x80001505; // 1000 0000 EINT2=P015
// 0000 0000
// 0001 0101 SPI0=P006 P005 P004
// 0000 0101 RxD0=P001 TxD0=P002
PINSEL1=0x120804aa; // 0001 0010 AD03=P030 CAP02=P028
// 0000 1000 DAC=P025
// 0000 0100 PWM5=P021
// 1010 1010 SPI1=P019 P018 P017 MAT02=P016
PINSEL2=0x00000004; // P131--P126做调试口
}
__inline void timer_config()
{
T0CTCR=0X00000000; // 定时器模式
T0PR=0x00000000; // 不再分频
T0TCR=0x00000001; // 使能定时器0
T1CTCR=0X00000000; // 定时器模式
T1PR=0x00000229; // 11.0592*5=55.296MHz,10us时基
T1TCR=0x00000001; // 使能定时器1
}
__inline void config_system(void)
{
port_config();
interrupt_config(); // 中断初始化
usart0_config(); // 串口初始化
pwm_config(); // PWM初始化
timer_config(); // 定时器初始化
}
__inline uint32 analyse_receive_data(void) // 原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回
{
uint32 loop,checksum,length;
length=*command_buffer;
checksum=0x40;
for (loop=length;loop!=0xffffffff;loop--) // 因为有效数据从地址0开始,故结束于0xffffffff
checksum+=*(command_buffer+loop);
if ((checksum&0x000000ff)==0x00000000) // 校验通过
{
loop=*(command_buffer+1); // 借用loop做临时变量
if (loop>0x000000bf) // 读写类指令
return(loop&0x000000f0); // 分类返回0xc0 0xe0 0xf0
if (loop<0x00000020) // 控制类指令
return(0x000000000); // 分类返回0x00
}
else
return(0x000000001); // 校验错就返回0x01,否则分类返回0x00 0xc0 0xe0 0xf0
}
void control_ReadWrite(void)
{
uint32 usart0_current_command;
usart0_current_command=*(command_buffer+1);
switch(usart0_current_command) // 处理工作参数
{
case CMD_SET_BAUT_RATE: // 设置读写器串口波特率
break;
case CMD_GET_VERSION: // 获得读写器版本号
IOPIN=IOPIN^0x00800000;
break;
case CMD_SET_OUTPUT_POWER: // 设置读写器射频输出功率
break;
case CMD_SET_FREQUENCY: // 设置读写器射频频率
break;
case CMD_READ_PARAMETER: // 获得读写器工作参数
break;
case CMD_SET_MOD_DEEPTH: // 设置读写器调制深度
break;
case CMD_GET_MOD_DEEPTH: // 获得读写器调制深度
break;
case CMD_SET_OPERATION_PARAMETER: // 设置读写器工作参数
break;
case CMD_GET_JAMMING: // 获得外部射频干扰值
break;
case CMD_SET_DEFAULT_PARAMETER: // 设置读写器出厂参数
break;
case CMD_COPY_DEFAULT_PARAMETER: // 恢复读写器出厂参数
break;
case CMD_SET_ANTENNA_NUM: // 设置读写器天线数
break;
case CMD_SET_FREQUENCY_CH: // 设置读写器频道数
break;
case CMD_REBOOT: // 复位读写器
break;
default:
break;
}
}
void em_ReadWrite(void)
{
}
void epcc1g2_ReadWrite(void)
{
}
void iso6b_ReadWrite(void)
{
}
void usart0_receive_process(void) // usart0.c
{
uint32 checksum;
if (usart0_receive_ok)
{
//原文档带参数,考虑到接收缓冲区是全局的,就直接用,不传指针进函数,且带参数返回区分各类命令
//省掉全局变量sumcheck_ok
usart0_signal_flags=0; // 复位串口0标志
checksum=analyse_receive_data();
switch (checksum)
{
case 0x00:
control_ReadWrite();
break;
case 0xc0:
em_ReadWrite();
break;
case 0xe0:
epcc1g2_ReadWrite();
break;
case 0xf0:
iso6b_ReadWrite();
break;
default: // 校验错
break;
}
}
}
int main (void)
{
uint32 timerdelay;
config_system();
timerdelay=T1TC;
while(1)
{
if (usart0_receiving)
{
if (T1TC-usart0_timer_base>usart0_timer_over_value) // 串口0接收超时
usart0_signal_flags=0; // 复位串口0标志
}
usart0_receive_process();
//IOPIN=IOPIN^0x00800000;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -