📄 mycommio.c
字号:
/*
**ASIM00 - Asynchronous Serial Interface Mode register
**
**TXE00 RXE00 X X X X 0 0
** | | | | | |_ASIM00.2: Transmit data stop bit length specification
** | | | | | 0: 1 bit; 1: 2 bits
** | | | | |
** | | | | |___ASIM00.3: Character length specification
** | | | | 0: 7 bits; 1: 8 bits
** | | | |
** | | |_|_____ASIM00.4, ASIM00.5: Parity bit specification
** | | 00: No parity;
** | | 01: Always add 0 parity at transmission
** | | Parity check is not performed at reception
** | | (No parity error is generated).
** | | 10: Odd parity
** | | 11: Even parity
** | |
** | |___________ASIM00.6: Receive operation control
** | 0: Receive operation disabled
** | 1: Receive operation enabled
** |
** |_________________ASIM00.7: Transmit operation control
** 0: Transmit operation disabled
** 1: Transmit operation enabled
*/
//ASIM00 = 0b11111000 //Transmit Receive operation all eabled.
//Even parity, 8bit data, 1 stop bit
/*
**ASIS00 - Asynchronous serial interface status register
**
**0 0 0 0 0 X X X
** | | |_ASIS00.0: Overrun error flag
** | | 0: Overrun error not generated
** | | 1: bitsOverrun error generated
** | |
** | |___ASIS00.1: Flaming error flag
** | 0: Flaming error not generated
** | 1: Flaming error generated
** |
** |_____ASIS00.2: Parity error flag
** 0: Parity error not generated
** 1: Parity error generated
*/
/*
**BRGC00 - Baud rate generator control register
**
**X X X X 0 0 0 0
**| | | |
**|_|_|_|__3-bit counter source clock selection (fx = 5MHz)
** 0000-------------- fx/2 (do not select n = 1 if fx = 5MHz)
** 0001-------------- fx/4 76800 bps
** 0010-------------- fx/8 38400 bps
** 0011-------------- fx/16 19200 bps
** 0100-------------- fx/32 9600 bps
** 0101-------------- fx/64 4800 bps
** 0110-------------- fx/128 2400 bps
** 0111-------------- fx/256 1200 bps
** 1000-------------- Input clock to ASCK pin from external
** other settings---- Not to be set
*/
//BRGC00 = 0b01110000 //1200 baud rate
/*
//???
INTSR00 ---- a reception completion interrupt.
INTST00 ---- a transmission completion interrupt.
SRMK00 ---- Interrupt Mask Flag for reception interrupt.
STMK00 ---- Interrupt Mask Flag for transmission interrupt.
TXS00 ---- Transmit shift register:This register is used to specify data
to be transmitted. Data written to TXS is transmitted as
serial data.
RXB00 ---- Receive buffer register:This register is used to hold
received data. Each time one byte of data is received, a new
byte of data is transferred from the receive shift register
(RXS).
*/
#pragma SFR //special function register
#pragma NOP
#pragma DI
#pragma EI
//Interrupt serve function name Inter_TM0.
#pragma interrupt INTTM00 Inter_TM0
#pragma interrupt INTST00 Inter_ST
#pragma interrupt INTSR00 Inter_SR
#include "MyDefine.h"
#include "MyCommIO.h"
#define MAX232_ENABLE P2.0
extern Uchar* ChinCharStr; //2003-10-30 15:10
extern bit g_btReceptionEnd;
extern bit g_btTransmitStart;
//SERIAL_BUF_TRANSMIT and SERIAL_BUF_RECEPTION are defined in the file
//"MyDefine.h".
Uchar g_bufTransmit[SERIAL_BUF_TRANSMIT]; //Transmit buffer
Uchar g_bufReception[SERIAL_BUF_RECEPTION]; //RECEPTION buffer
Uchar hanZiByteAmount; //2003-10-30 15:10
sreg Uchar g_byteLength;
sreg Uchar g_controlCode;
sreg Uchar g_deviceAddr;
sreg Uchar s_g_transRec500msCnt;
sreg Uchar g_custom0;
sreg Uchar g_custom1;
sreg Uchar g_custom2;
sreg Uchar g_dataFormat;
sreg Uchar g_keyValue;
bit g_btCrcCheckOk;
bit g_btWait20ms;
bit btReception500msOn;
//sreg Uchar *g_p_bufTransmit = g_bufTransmit;
//sreg Uchar *g_p_bufReception = g_bufReception;
sreg Uchar *g_p_bufTransmit;
sreg Uchar *g_p_bufReception;
//The buffer for transmission is cleared.
void ClearTransmitBuf();
//The buffer for reception is cleared.
void ClearReceptionBuf();
Uchar ByteLengthSelection(Uchar);
Uchar CheckSumTransmit(Uchar);
void CommReceptionEnabled();
Uchar ErrorRceptionCheck();
/*
** Function name: InitializeCom
**
* Description:
** The function is mainly to initialize the relevant registers.
**
** Input parameters:
** no
**
* * Output parameters:
** no
**
** Return value:
** no
*/
void InitializeCom()
{
CSIM00 = 0; //Use UART mode
MAX232_ENABLE = 0;
ASIM00 = 0b01111000;
BRGC00 = 0x70; //1200 baud rate
//SRMK00 = 1; //UART recetive enabled
//CommReceptionEnabled();
SRMK00 = 0; //Interrupt Mask Flag for reception interrupt disabled.
STMK00 = 1; //Enable Interrupt Mask Flag for reception interrupt.
P2.1 = 1; //COMM transmission is set to 1.
//TM0 used in Reception process.
CR00 = 0x12; //Resolution -- 102.4us 2003-9-11 11:19
TMC00 = 0x82; //8bitTimer0 is set to 2ms and enabled.
TMIF00 = 0; //clear Interrupt Request Flag
TMMK00 = 0; //INTTM0 interrupt enabled
g_p_bufTransmit = g_bufTransmit;
g_p_bufReception = g_bufReception;
g_btWait20ms = 0;
s_g_transRec500msCnt = 0;
btReception500msOn = 0;
g_btReceptionEnd = 0;
g_btTransmitStart = 0;
//The buffer for transmission is cleared.
ClearTransmitBuf();
//The buffer for reception is cleared.
ClearReceptionBuf();
}
/*
** Function name: SetDataTransmitBuffer
**
* Description:
** The function is to push the data to be transmitted into
** transmission buffer array, i.e. g_bufTransmit[].
**
** Input parameters:
** control code
**
* * Output parameters:
** no
**
** Return value:
** no
*/
void SetDataTransmitBuffer(Uchar ctlCode)
{
//s_p_bufTransmit is initialized to point to the array of g_bufTransmit.
Uchar *p_bufTransmit = g_bufTransmit;
//2003-10-30 15:11
Uchar *p = g_bufTransmit; //Temporary pointer p is used to save the
//pointer g_bufTransmit that points to ctlCode.
ClearTransmitBuf();
//sreg Uchar s_pushByteLength = g_byteLength + 4;
*p_bufTransmit++ = STX;
*p_bufTransmit++ = ctlCode;
//2003-10-30 15:11
p = p_bufTransmit;
*p_bufTransmit++ = ByteLengthSelection(ctlCode);
*p_bufTransmit++ = DEVICE_ADDR;
switch(ctlCode)
{
case 4: //HSR7217 -> main CPU key value
*p_bufTransmit++ = g_keyValue;
*p_bufTransmit = CheckSumTransmit(ctlCode);
break;
//..still have more....
case 8:
while((*ChinCharStr) != '0')
{
*p_bufTransmit++ = *ChinCharStr++;
++hanZiByteAmount;
}
*p = ByteLengthSelection(ctlCode);
*p_bufTransmit = CheckSumTransmit(ctlCode);
break;
default:
break;
}
/*
if(s_pushByteLength-- > 0)
{
*s_p_bufTransmit++ = transmitData;
}
else
{
s_pushByteLength = g_byteLength + 4;
s_p_bufTransmit = g_bufTransmit;
}
*/
}
/*
** Function name: Inter_ST
**
* Description:
** The function is ISR - Interrupt Service Routine of transmission
** completion interrupt.
**
** Input parameters:
** no
**
* * Output parameters:
** no
**
** Return value:
** no
*/
void Inter_ST()
{
static sreg Uchar s_transmitCnt = 0;
//Note:firstly delay for 26.2ms every time and add "RUN = 1" in this
// delay procedure in order to clear WDT.
#asm
PUSH BC
mov B, #16 ;1.2us
?LINTST1:
mov C, #0
set1 run
?LINTST2:
NOP ;0.4us(5MHZ)
NOP ;0.4us
dbnz c,$?LINTST2 ;1.2us
dbnz b,$?LINTST1 ;1.2us
POP BC
#endasm
STIF00 = 0;
s_transmitCnt++;
//g_btTransmitStart = 0; //No use?Set g_btTransmitStart to 1 transmiting
//data in main procedure.!!!!!!
//An end code is added following the check code.
if(s_transmitCnt>(ByteLengthSelection(g_controlCode)+5))
{
g_btTransmitStart = 0;
CommReceptionEnabled(); //Is it redundant?
s_transmitCnt = 0;
//The pointer,i.e. g_p_bufTransmit, points to the first address of
//g_bufTransmit.
g_p_bufTransmit = g_bufTransmit;
}
else
{
//The value to be sent is assigned to TXS00.
TXS00 = *g_p_bufTransmit++;
}
// #asm
// POP BC
// #endasm
}
/*
** Function name: GetDataFromReception
**
* Description:
** The function is to judge control code and process the data
** received, and is invocated by MyCommMain.c.
**Operation:
** 1. finish CRC of data received;
** 2. gain data received;
** 3. carry out different procedure according to different control
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -