📄 softuart300.c
字号:
//------------------------------------------------------------------------------------
// FILE NAME : SoftUart300.c
// TARGET DEVICE : C8051F30X
// Modify ON : 03/30/05
// Modify BY : Maqingbo
//
//本程序用于半双工串口通信(P00用于接收发送,P01接收时钟)
#include "dsim.h"
#include "SoftUart300.h"
//#define SBAUDRATE0 9600 //用户定义的SW_UART 波特率
//#define SUART0_TIMER SYSCLK/SBAUDRATE0/4 //对应一个位时间的PCA 计数值(PCA 配置为对SYSCLK/4 计数)
//#define SUART0_STARTTIME SUART0_TIMER*3/2 // 3/2 位时间用于接收到一个起始位后在起始位边沿之后RX
//应在一个位时间内保持低电平第一个位采样在下一个位时间的中间开始
//------------------------------------------------------------------------------------------
// - 配置PCA: 模块0 设置为软件定时方式
// PCA 时基 = 由ECI提供
//
extern unsigned char GetChar;
extern bit FlagVFrist;
void WaitCCF0(void)
{
while (CCF0 == 0)
{
if (RST == 0)
RSTSRC |= 0x10; //软件强制复位
}
CCF0 = 0;
}
void PCA_INIT0(void)
{
PCA0CN = 0; // Leave PCA disabled
XBR0 |= 0x01; // P00 SKIP
XBR2 |= 0x01; // P01 ECI
PCA0MD = 0x06; // PCA时钟由ECI提供
CR = 0; // Stop PCA counter.
PCA0CPM0 = 0x48; // Change module 0 to software timer mode.
}
unsigned int PCA_TEMP0; // Temporary storage variable for manipulating PCA module high & low bytes.
//注意读PCA0时必须先读低位
void DelayCLKCount(unsigned int count)
{
PCA_TEMP0 = PCA0L; // Read PCA counter value into
PCA_TEMP0 |= (PCA0H << 8);
PCA_TEMP0 +=count;
PCA0CPL0 = PCA_TEMP0; // Restore PCA0CPL0 and PCA0CPH0
PCA0CPH0 = (PCA_TEMP0 >> 8); // with the updated value
CCF0 = 0;
CR = 1; // Start PCA counter.
WaitCCF0();
CR = 0;
}
void SetPCAToPCA0CPH(void)
{
PCA_TEMP0 = PCA0L; // Read PCA counter value into
PCA_TEMP0 |= (PCA0H << 8);
PCA_TEMP0 += SUART0_TIMER; // Add 1 bit times to PCA_TEMP
PCA0CPL0 = PCA_TEMP0; // Restore PCA0CPL0 and PCA0CPH0
PCA0CPH0 = (PCA_TEMP0 >> 8); // with the updated value
}
void SetPCA0CPHToPCA0CPH(void)
{
PCA_TEMP0 = (PCA0CPH0 << 8); // Read module 0 contents into
PCA_TEMP0 |= PCA0CPL0; // PCA_TEMP.
PCA_TEMP0 += SUART0_TIMER; // Add 1 bit time to PCA_TEMP
PCA0CPL0 = PCA_TEMP0; // Restore PCA0CPL0 and PCA0CPH0
PCA0CPH0 = (PCA_TEMP0 >> 8); // with the updated value
WaitCCF0();
}
unsigned char GetSCommChar0(unsigned char src,unsigned char tag) //读取一字节数据, 有数据返回
//Src = ME:从ME读数据 = SIM1:从SimCard 1读数据 = SIM2:从SimCard 2读数据
//tag = 0 :不转发 =ME 转发至ME = SIM1:转发至SimCard1 = SIM2:转发至SimCard2
{
unsigned char i;
unsigned char RXSHIFT0 = 0;
bit VerBit0;
P0MDOUT &= ~src; // Open-Drain
while ((P0 & src) != 0) // 等待起始位
{
if (RST == 0) RSTSRC |= 0x10; //软件强制复位
}
DelayCLKCount(80);
SetPCAToPCA0CPH();
CR = 1; // Start PCA counter.
if (tag)
{
P0MDOUT |= tag;
P0 &= ~tag;
}
WaitCCF0();
for (i = 0; i<8 ;i++)
{
RXSHIFT0 = RXSHIFT0 >> 1; // Shift right 1 bit
if ((P0 & src) != 0) // If SW_RX=1,
{
RXSHIFT0 |= 0x80; // shift '1' into RXSHIFT msb
if (tag) P0 |= tag;
}
else
{
if (tag) P0 &= ~tag;
}
SetPCA0CPHToPCA0CPH();
}
// State 9: 8-bits received, Capture Verify bit.
VerBit0 = 0;
if ((P0 & src) != 0)
{
VerBit0 = 1;
if (tag) P0 |= tag;
}
else
{
if (tag) P0 &= ~tag;
}
SetPCA0CPHToPCA0CPH();
// State 10: 8-bits,Verify bit received, Capture STOP bit.
if (tag) P0 |= tag;
SetPCA0CPHToPCA0CPH();
CR = 0; // Stop PCA Counter
return RXSHIFT0;
}
void SendSCommChar0(unsigned char ch,unsigned char No) //发送一字节
//No = 0:向ME写数据
// = 1:向SimCard 1写数据
// = 2:向SimCard 2写数据
{
bit VerBit0;
unsigned char i;
P0MDOUT |= No; // Push-Pull
P0 |= No;
ACC = ch;
if (_testbit_(P))
VerBit0 = 1;
else
VerBit0 = 0;
DelayCLKCount(380);
SetPCAToPCA0CPH();
CCF0 = 0;
P0 &= ~No; // 发送起始位
CR = 1; // Start PCA counter.
WaitCCF0();
for (i = 0; i<8 ;i++)
{
if (ch & 0x01)
P0 |= No; // Output LSB of TDR onto SW_TX pin.
else
P0 &= ~No;
ch >>= 1; // Shift TDR right 1 bit.
SetPCA0CPHToPCA0CPH();
}
if (VerBit0)
P0 |= No; // Output LSB of TDR onto SW_TX pin.
else
P0 &= ~No;
SetPCA0CPHToPCA0CPH();
P0 |= No;
SetPCA0CPHToPCA0CPH();
CR = 0; // Stop PCA Counter
}
extern unsigned char DataBuffer[];
void SendSCommStr0(unsigned char *str,unsigned char len,unsigned char No)
{
unsigned char i;
for ( i=0; i<len ;i++)
{
SendSCommChar0(str[i],No);
}
}
unsigned char Reverse(unsigned char ch)
{
unsigned char i,j;
i = 0x1; j = 0;
while (i != 0x80)
{
if ((ch & i)==0)
{
j++;
}
j = j*2;
i = i*2;
}
if ((ch & i) == 0)
{
j++;
}
return j;
}
void SendSCommChar0V(unsigned char ch,unsigned char No) //发送一字节
//No = 0:向ME写数据
// = 1:向SimCard 1写数据
// = 2:向SimCard 2写数据
{
bit VerBit0;
unsigned char i;
P0MDOUT |= No; // Push-Pull
P0 |= No;
ACC = ch;
if (_testbit_(P))
VerBit0 = 1;
else
VerBit0 = 0;
if (No != ME)
VerBit0 = !VerBit0;
DelayCLKCount(380);
SetPCAToPCA0CPH();
CCF0 = 0;
P0 &= ~No; // 发送起始位
CR = 1; // Start PCA counter.
WaitCCF0();
for (i = 0; i<8 ;i++)
{
if (ch & 0x80)
P0 &= ~No; // Output LSB of TDR onto SW_TX pin.
else
P0 |= No;
ch <<= 1; // Shift TDR right 1 bit.
SetPCA0CPHToPCA0CPH();
}
if (VerBit0)
P0 |= No; // Output LSB of TDR onto SW_TX pin.
else
P0 &= ~No;
SetPCA0CPHToPCA0CPH();
P0 |= No;
SetPCA0CPHToPCA0CPH();
CR = 0; // Stop PCA Counter
}
void SendSCommStr0V(unsigned char *str,unsigned char len,unsigned char No)
{
unsigned char i;
for ( i=0; i<len ;i++)
{
SendSCommChar0V(str[i],No);
}
}
unsigned char GetSCommChar0_Test(unsigned char src,unsigned char tag)
{
unsigned char i;
unsigned char RXSHIFT0 = 0;
bit VerBit0;
P0MDOUT &= ~src;
while ((P0 & src) != 0) // 等待起始位
{
DelayCLKCount(1);
if (Test_Count) Test_Count --;
else return 0xff;
}
DelayCLKCount(80);
SetPCAToPCA0CPH();
CR = 1; // Start PCA counter.
if (tag)
{
P0MDOUT |= tag;
P0 &= ~tag;
}
WaitCCF0();
for (i = 0; i<8 ;i++)
{
RXSHIFT0 = RXSHIFT0 >> 1; // Shift right 1 bit
if ((P0 & src) != 0) // If SW_RX=1,
{
RXSHIFT0 |= 0x80; // shift '1' into RXSHIFT msb
if (tag) P0 |= tag;
}
else
{
if (tag) P0 &= ~tag;
}
SetPCA0CPHToPCA0CPH();
}
// State 9: 8-bits received, Capture Verify bit.
VerBit0 = 0;
if ((P0 & src) != 0)
{
VerBit0 = 1;
if (tag) P0 |= tag;
}
else
{
if (tag) P0 &= ~tag;
}
SetPCA0CPHToPCA0CPH();
// State 10: 8-bits,Verify bit received, Capture STOP bit.
if (tag) P0 |= tag;
SetPCA0CPHToPCA0CPH();
CR = 0; // Stop PCA Counter
return RXSHIFT0;
}
unsigned char GetSCommChar0V(unsigned char src,unsigned char tag) //读取一字节数据, 数据返回
//Src = ME:从ME读数据 = SIM1:从SimCard 1读数据 = SIM2:从SimCard 2读数据
//tag = 0 :不转发 =ME 转发至ME = SIM1:转发至SimCard1 = SIM2:转发至SimCard2
{
unsigned char i;
unsigned char tag1;
unsigned char RXSHIFT0 = 0;
bit VerBit0;
ACC = GetChar;
if (_testbit_(P))
VerBit0 = 1;
else
VerBit0 = 0;
if (tag != ME)
VerBit0 = !VerBit0;
if (FlagVFrist) tag1 = 0;
else tag1 = tag;
P0MDOUT &= ~src; // Open-Drain
while ((P0 & src) != 0) // 等待起始位
{
if (RST == 0) RSTSRC |= 0x10; //软件强制复位
}
DelayCLKCount(80);
SetPCAToPCA0CPH();
CR = 1; // Start PCA counter.
if (tag1)
{
P0MDOUT |= tag1;
P0 &= ~tag1;
}
WaitCCF0();
for (i = 0; i<8 ;i++)
{
RXSHIFT0 = RXSHIFT0 >> 1; // Shift right 1 bit
if ((P0 & src) != 0) // If SW_RX=1,
RXSHIFT0 |= 0x80; // shift '1' into RXSHIFT msb
if (tag1)
{
if (GetChar & 0x80)
P0 &= ~tag1; // Output LSB of TDR onto SW_TX pin.
else
P0 |= tag1;
}
GetChar <<= 1; // Shift TDR right 1 bit.
SetPCA0CPHToPCA0CPH();
}
// State 9: 8-bits received, Capture Verify bit.
if (tag1)
{
if (VerBit0)
P0 |= tag1;
else
P0 &= ~tag1;
}
SetPCA0CPHToPCA0CPH();
// State 10: 8-bits,Verify bit received, Capture STOP bit.
if (tag1) P0 |= tag1;
SetPCA0CPHToPCA0CPH();
CR = 0; // Stop PCA Counter
return RXSHIFT0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -