|
main.c
/****************************************************************************/
/* */
/* Copyright (c) 2016, 老馬工作室 */
/* All rights reserved. */
/* */
/* Email:pcwebmaster@163.com */
/****************************************************************************/
/****************************************************************************/
/* 文 件 名:comint.c */
/* 版 本:Version 1.0 */
/* 描 述:串行口中斷帶通訊協(xié)議測試 */
/* 主控芯片:MSP430G2553 */
/* 晶振頻率:內(nèi)部1MHz */
/* 編譯環(huán)境:CCS5.4 Grace初始化 */
/* 作 者:pcwebmaster(北極狼) */
/* 函 數(shù): */
/* system_init */
/* com_send_command */
/* com_command_receive */
/* CalCRC16_1021 */
/* command_decoder */
/* send_command */
/* 測 試: 發(fā)送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */
/* 測試現(xiàn)象: */
/* 歷史記錄:20016.02.23測試通過 */
/* 北極狼 20016-02-23 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include <msp430.h>
/* ======== Grace related includes ======== */
#include <ti/mcu/msp430/Grace.h>
unsigned char *str = "Hello World!\n\r Serial test normal!\n\r";
unsigned char *str1= "串口測試正常!\n\r";
/* ======== main ======== */
int main(void)
{
Grace_init(); // Activate Grace-generated configuration
buff_init();
// >>>>> Fill-in user code here <<<<<
Send_String(str);//測試
Send_String(str1);//測試
while(1)
{
com_command_receive();
}
return (0);
}
Comint.c
/****************************************************************************/
/* */
/* Copyright (c) 2016, 老馬工作室 */
/* All rights reserved. */
/* */
/* Email:pcwebmaster@163.com */
/****************************************************************************/
/****************************************************************************/
/* 文 件 名:comint.c */
/* 版 本:Version 1.0 */
/* 描 述:串行口中斷帶通訊協(xié)議測試 */
/* 主控芯片:MSP430G2553 */
/* 晶振頻率:內(nèi)部1MHz */
/* 編譯環(huán)境:CCS5.4 Grace初始化 */
/* 作 者:pcwebmaster(北極狼) */
/* 函 數(shù): */
/* system_init */
/* com_send_command */
/* com_command_receive */
/* CalCRC16_1021 */
/* command_decoder */
/* send_command */
/* 測 試: 發(fā)送:16 16 02 01 02 01 00 35 03 94 BD接收:49 AA 15 */
/* 測試現(xiàn)象: */
/* 歷史記錄:20016.02.23測試通過 */
/* 北極狼 20016-02-23 Creat Inital version. (Version 1.0) */
/****************************************************************************/
#include <msp430.h>
#include <ti/mcu/msp430/Grace.h>
#include "comint.h"
uint8_t pint_buf[MAX_RINTL]; /* 串口接收緩沖區(qū) */
uint8_t pint_read; /* 串口緩沖區(qū)讀指針 */
uint8_t pint_write; /* 串口緩沖區(qū)寫指針 */
//uint8_t psend_int; /* 串口發(fā)送允許標(biāo)志 */
uint8_t serial_flag = 0; /* 串口接收數(shù)據(jù)標(biāo)志位 */
uint8_t prec_buf[MAX_COMMAND_LEN]; /* 命令接收緩沖區(qū) */
uint8_t prec_num; /* 命令接收緩沖區(qū)字節(jié)數(shù) */
uint8_t serial_lengthl = 0; /* 消息命令長度低8位 */
uint16_t serial_length = 0; /* 消息命令長度16位 */
uint8_t ADDRESS[2]={ZU,ZHAN}; /* byte0:通訊組地址, byte1:站地址 */
//-----------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------
void USCI_A0_graceInit(void)
{
/* USER CODE START (section: USCI_A0_graceInit_prologue) */
/* User initialization code */
/* USER CODE END (section: USCI_A0_graceInit_prologue) */
/* Disable USCI */
UCA0CTL1 |= UCSWRST;
/*
* Control Register 1
*
* UCSSEL_2 -- SMCLK
* ~UCRXEIE -- Erroneous characters rejected and UCAxRXIFG is not set
* ~UCBRKIE -- Received break characters do not set UCAxRXIFG
* ~UCDORM -- Not dormant. All received characters will set UCAxRXIFG
* ~UCTXADDR -- Next frame transmitted is data
* ~UCTXBRK -- Next frame transmitted is not a break
* UCSWRST -- Enabled. USCI logic held in reset state
*
* Note: ~<BIT> indicates that <BIT> has value zero
*/
UCA0CTL1 = UCSSEL_2 | UCSWRST;
/*
* Modulation Control Register
*
* UCBRF_0 -- First stage 0
* UCBRS_1 -- Second stage 1
* ~UCOS16 -- Disabled
*
* Note: ~UCOS16 indicates that UCOS16 has value zero
*/
UCA0MCTL = UCBRF_0 | UCBRS_1;
/* Baud rate control register 0 */
UCA0BR0 = 104;
/* Enable USCI */
UCA0CTL1 &= ~UCSWRST;
/* USER CODE START (section: USCI_A0_graceInit_epilogue) */
/* User code */
/* USER CODE END (section: USCI_A0_graceInit_epilogue) */
}
//-----------------------------------------------------------------
// 串口發(fā)送一個字節(jié)
//-----------------------------------------------------------------
void com_send_command(char Onebyte)
{
UCA0TXBUF = Onebyte;
__delay_cycles(2000);//發(fā)送漢字參數(shù)2000,發(fā)送字符參數(shù)為1000
}
//------------------------------------------------------------------
// 串口接收中斷程序
//------------------------------------------------------------------
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR_HOOK(void)
{
uint8_t temp;
uint8_t temp1;
// USER CODE START (section: USCI0RX_ISR_HOOK)
// replace this comment with your code
// USER CODE END (section: USCI0RX_ISR_HOOK)
while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX buffer ready?
//判斷串口的發(fā)送是否正在工作,
//因為要使用發(fā)送功能,所以得判斷發(fā)送是否忙碌,
//只有在不忙碌的時候才可以啟用發(fā)送。
//這一句就是判斷發(fā)送是否在工作,如果是在工作,那么一直等待到不工作為止。
temp1 = UCA0RXBUF; //讀取數(shù)據(jù) // TX -> RXed character
temp = pint_write + 1; /* 判斷是否可以寫入 */
if (temp == MAX_RINTL)
{
temp=0;
}
if (temp != pint_read)
{
pint_buf[pint_write] = temp1; /* 讀取數(shù)據(jù) */
pint_write = temp;
}
}
void buff_init(void)
{
uint8_t loop;
loop = UCA0RXBUF; /* 清串口緩沖區(qū) */
for (loop=0; loop<MAX_RINTL; loop++)
{
pint_buf[loop] = 0;
}
}
Comint.h
#ifndef __COMINT_H__
#define __COMINT_H__
#include <stdio.h>
#include <msp430.h>
#define INT8U unsigned char
#define INT16U unsigned int
#define uint8_t unsigned char
#define u_short unsigned int
#define uint16_t unsigned int
#define ZU 0x01 /*組地址*///通訊地址修改這兩項
#define ZHAN 0x02 /*站地址*///通訊地址修改這兩項
#define MAX_RINTL 16 /* 串口接收緩沖區(qū)長度 */
#define SYN 0x16 /* 通訊同步位*/
#define STX 0x02 /* 通訊起始位*/
#define ETX 0x03 /* 通訊結(jié)束位*/
#define ACK 0x06
#define NAK 0x15
#define MSG_ACK 2 /* 正確應(yīng)答信息 */
#define MSG_NAK 3 /* 錯誤應(yīng)答信息 */
#define MAX_COMMAND_LEN 16 /* 串口接受命令長度 */
extern uint8_t pint_read; // 串口緩沖區(qū)讀指針 */
extern uint8_t pint_write; // 串口緩沖區(qū)寫指針
extern uint8_t pint_buf[MAX_RINTL]; // 串口接收緩沖區(qū)
extern uint8_t serial_flag; /* 串口接收數(shù)據(jù)標(biāo)志位 */
extern uint8_t prec_buf[MAX_COMMAND_LEN];/* 命令接收緩沖區(qū) */
/* 串口初始化*/
void Serial_port_init(void);
/* 串口發(fā)送一個字節(jié) */
void com_send_command(char Onebyte);
void Send_String(char *str);// 向PC機(jī)發(fā)送字符串
/* 串口接收數(shù)據(jù)處理 */
void com_command_receive(void);
/* 串口接收初始化 */
void buff_init(void);
///* 串口接收一字節(jié)數(shù)據(jù) */
//unsigned char UartReadChar(void); //reentrant
/*計算CRC校驗和使用MTT(0X1021)
參數(shù):
pBuff 為需計算CRC的緩沖區(qū)的頭指針
BufferLen 緩沖區(qū)長度(以字節(jié)計)
*/
u_short CalCRC16_1021(uint8_t x[], u_short BufferLen);
/* 命令解碼子程序 */
void command_decoder(void);
/* 向主機(jī)發(fā)送消息幀,入口參數(shù):消息類型 */
void send_command(uint8_t command);
#endif
|
|