CC2530與IM1281B通信進入不了中斷。
大二新人,求前輩解答,請具體一點,基礎知識有點弱,可能有些地方不太懂,以下是代碼
#include "ioCC2530.h"
#include <string.h>
#define UART0_RX 1
#define UART0_TX 2
unsigned char dataRecv;
unsigned char Flag = 0;
char UartState;//串口當前狀態
typedef unsigned char uchar;
typedef unsigned int uint;
unsigned char Tx_Buffer[8];
unsigned char Rx_Buffer[40];
unsigned char read_enable,receive_finished,receive_number;
unsigned long Voltage_data,Current_data,Power_data,Energy_data,Pf_data,CO2_data;
unsigned char Read_ID = 0x01;
/********************延時函式*************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<1070; j++);
}
/*******************設定系統時鐘源*********************/
void InitCLK()
{
CLKCONCMD &= ~0x40; //設定系統時鐘源為32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振穩定為32M
CLKCONCMD &= ~0x47; //設定系統主時鐘頻率為32MHZ
}
/******************串口初始化函式**********************/
void Init_Uart0()
{
PERCFG = 0x00; // UART0 選擇位置0 [email protected] [email protected]
P0SEL |= 0x0C; // P0.3 P0.2選擇外設功能
U0CSR |= 0xC0; // UART模式 接收器使能
P2DIR &= ~0xc0; //P0優先作為UART0
IEN1 |=0x20;
P0IEN |= 0x08;
U0GCR |= 7; // 查表獲得 U0GCR 和 U0BAUD
U0BAUD = 59; // 4800
URX0IF = 1; // 使能接收中斷 IEN0@BIT2
EA=1;
}
/******************UR0接收中斷服務函式****************/
#pragma vector = URX0_VECTOR
__interrupt void UR0_RecvInt()
{
dataRecv = U0DBUF; //將資料從接識訓沖區讀出
URX0IF = 0; //清除RX接收中斷標志
Flag = 1; //設定接收指令標志
}
/****************計算crc校驗碼,不必搞清怎么算的********************/
unsigned int calccrc(unsigned char crcbuf,unsigned int crc)
{
unsigned char i;
unsigned char chk;
crc=crc ^ crcbuf; //異或相同為零
for(i=0;i<8;i++) {
chk=( unsigned char)(crc&1);
crc=crc>>1;
crc=crc&0x7fff; //最高位置零
if (chk==1)
crc=crc^0xa001; //取異或。相同為零
crc=crc&0xffff; //自己付給自己,定值0xa001
}
return crc;
}
unsigned int chkcrc(unsigned char *buf,unsigned char len)
{
unsigned char hi,lo;
unsigned int i;
unsigned int crc;
crc=0xFFFF;
for(i=0;i<len;i++) {
crc=calccrc(*buf,crc);
buf++;
}
hi=( unsigned char)(crc%256); //低八位
lo=( unsigned char)(crc/256); //高八位
crc=(((unsigned int)(hi))<<8)|lo; //高八位低八位交換位置
return crc;
}
/******************UR0發送字串函式*****************/
void UartSend(unsigned char *Data, int len)//發送函式
{
uint i;
// U0CSR &= ~0x40; //禁止接收
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);//中斷標志位為0
UTX0IF = 0;
}
// U0CSR |= 0x40; //允許接收
}
/***********************發送‘總’函式************************/
void read_data(void) { //讀操作
union crcdata {
unsigned int word16;
unsigned char byte[2];
}crcnow;
if(read_enable==1) // 到時間抄讀模塊,抄讀間隔 1 秒鐘(或其他)
{
read_enable=0;
Tx_Buffer[0]=Read_ID; //模塊的 ID 號,默認 ID 為 0x01
Tx_Buffer[1]=0x03;
Tx_Buffer[2]=0x00;
Tx_Buffer[3]=0x48;
Tx_Buffer[4]=0x00;
Tx_Buffer[5]=0x08;
crcnow.word16=chkcrc(Tx_Buffer,6);
Tx_Buffer[6]=crcnow.byte[1]; //CRC 效驗低位元組在前
Tx_Buffer[7]=crcnow.byte[0];
UartSend(Tx_Buffer,8); //發送 8 個資料,請根據單片機型別自己編程
}
}
/*******************驗證發送是否有錯誤,廠家所給*********************/
void Analysis_data(void) {
union crcdata {
unsigned int word16;
unsigned char byte[2];
}crcnow;
if(receive_finished==1) //接收完成
{
receive_finished=0;
if(
Rx_Buffer[0]==Read_ID) //確認 ID 正確
{
crcnow.word16=chkcrc(Rx_Buffer,receive_number-2); //receive_numbe 是接收資料總長度
if((crcnow.byte[0]==Rx_Buffer[receive_number-1])&&(crcnow.byte[1]==Rx_Buffer[receive_number-2]))
//確認 CRC 校驗正確
{
Voltage_data=https://bbs.csdn.net/topics/(((unsigned long)(Rx_Buffer[3]))<<24)|(((unsigned long)(Rx_Buffer[4]))<<16)|(((unsigned long)(Rx_Buffer[5]))<<8)|Rx_Buffer[6];
Current_data=https://bbs.csdn.net/topics/(((unsigned long)(Rx_Buffer[7]))<<24)|(((unsigned long)(Rx_Buffer[8]))<<16)|(((unsigned long)(Rx_Buffer[9]))<<8)|Rx_Buffer[10];
Power_data=https://bbs.csdn.net/topics/(((unsigned long)(Rx_Buffer[11]))<<24)|(((unsigned long)(Rx_Buffer[12]))<<16)|(((unsigned long)(Rx_Buffer[13]))<<8)|Rx_Buffer[14];
Energy_data=https://bbs.csdn.net/topics/(((unsigned long)(Rx_Buffer[15]))<<24)|(((unsigned long)(Rx_Buffer[16]))<<16)|(((unsigned long)(Rx_Buffer[17]))<<8)|Rx_Buffer[18];
Pf_data=https://bbs.csdn.net/topics/(((unsigned long)(Rx_Buffer[19]))<<24)|(((unsigned long)(Rx_Buffer[20]))<<16)|(((unsigned long)(Rx_Buffer[21]))<<8)|Rx_Buffer[22];
CO2_data=https://bbs.csdn.net/topics/(((unsigned long)(Rx_Buffer[23]))<<24)|(((unsigned long)(Rx_Buffer[24]))<<16)|(((unsigned long)(Rx_Buffer[25]))<<8)|Rx_Buffer[26];
}
}
}
}
/*************************主函式*********************/
void main()
{
Init_Uart0(); //初始化串口0
InitCLK(); //設定系統時鐘源
P0SEL &= 0xff;
UartState = UART0_TX; //串口0默認處于發送模式
while(1)
{
if(UartState == UART0_TX)
{
DelayMS(1);
read_enable=1;
read_data();
UartState = UART0_RX;
}
if(UartState == UART0_RX)
{
receive_finished = 0;
receive_number = 0;
// DelayMS(1000);
while(Flag == 1)
{
if(receive_number<37)
{
Rx_Buffer[0]=dataRecv;
//Rx_Buffer[receive_number++]=dataRecv;
receive_number++;
}
if(receive_number==37)
{
UartState = UART0_TX;
receive_finished = 1;
Analysis_data();
Flag=0;
}
}
UartState = UART0_TX;
// UTX0IF = 0; //接收標志位
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/79995.html
標籤:硬件使用
上一篇:關于KEIL5.23版本 呼叫隨機函式rand()沒有亂數產生,求解決辦法
下一篇:單片機
