📄 hndshake.c
字号:
unsigned char orig_V22_600()
{
return(NYI);
}
unsigned char orig_V21()
{
return(NYI);
}
unsigned char orig_212a()
{
return(NYI);
}
unsigned char orig_202()
{
return(NYI);
}
unsigned char orig_202r()
{
return(NYI);
}
unsigned char orig_103()
{
// Stage 1
CMXRXMODE &= 0x0E00; // Mask Rx Gain settings
CMXRXMODE ^= 0x7038; // Setup Rx for high band Bell 103 300bps and auto-equaliser disabled
// Descrambler Disabled and synchronous operation
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
if (unscram1sdet(5) != OK) return(NOCARRIER); // Detect unscram 1's for 150ms (1's detect has approx 100ms (32bits) response time)
// Stage 2
DCDN = 0; // Clear DCDN line.
DCDIND = 1; // Turn on CD LED.
GPT1 = 77; // Start 770ms timer
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if wait carrier after dial timer has expired
}
} while (GPT1 >= 32); // Wait until 450ms has expired
// Stage 3
CMXTXDATA = 0xFF;
wr_cbus(CMXTXDATA_ADDR,CMXTXDATA); // Ensure Tx data reg is all 1's
CMXTXMODE &= 0x0E00; // Mask Tx Gain settings
CMXTXMODE ^= 0x601F; // Setup Tx for low band Bell 103 300bps, no guard tone
// No Guard tone, scram disabled, sync operation, Tx data byte reg
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
// Stage 4
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if wait carrier after dial timer has expired
}
} while (GPT1 != 0); // Ensure 770ms timer has expired
// Stage 5
async_setup(); // Configure Tx/Rx for async operation (settings extracted from S25 and S26)
return(CON300); // Return Connect 300
}
void ans_tone()
{
// Stage 1 Tx No Tone for 2.2s
CMXTXMODE &= 0x0E00; // Mask Tx Gain settings
CMXTXMODE ^= 0x1000; // Initially setup Tx for tones, no guard tone
// No Guard tone, scrambler Disabled, fixed tone, no tone
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
GPT3 = 22; // Start 2.2s timer
while(GPT3 != 0)
continue;
// Stage 2 Tx 2100Hz for 3.3s
CMXTXMODE ^= 0x000A; // No Guard tone, scrambler Disabled, fixed tone, 2100Hz
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
GPT3 = 33; // Start 3.3s timer
while(GPT3 != 0)
continue;
// Stage 3 Tx No Tone for 80ms
CMXTXMODE &= 0xFF00; // No Guard tone, scrambler Disabled, fixed tone, no tone
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
GPT1 = 8; // Start 80ms timer
while(GPT1 != 0)
continue;
}
unsigned char ans_V22bis()
{
unsigned char det32ones = 0;
unsigned char tx2400flag = 0;
unsigned char gotS1pattern = 0;
// Stage 1 Tx unscrambled 1's
CMXRXMODE &= 0x0E00; // Mask Rx Gain settings
CMXRXMODE ^= 0xC0F8; // Setup Rx for low band V.22 1200bps and auto-equaliser disabled
// Descrambler enabled, synchronous operation
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
CMXTXDATA = 0xFF;
wr_cbus(CMXTXDATA_ADDR,CMXTXDATA); // Ensure Tx data reg is all 1's
CMXTXMODE &= 0x0E00; // Mask Tx Gain settings
CMXTXMODE ^= (((int) S23) << 1) & 0x0180; // Extract Guard Tone setting from S23.
CMXTXMODE ^= 0xD01F; // Initially setup Tx for high band V.22 1200bps
// Scrambler Disabled, sync and Tx data byte
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update CBUS register
// Stage 2 Look for scrambled 1's and also S1 pattern if V22bis selected
GPT1 = 24; // Start 270ms timer (scram 1's detect has approx 30ms (32 bits) response time)
do {
DelayMs(5); // Insert 5ms polling delay
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if general purpose timer (S18) has expired
}
CMXSTAT = rd16_cbus(CMXSTAT_ADDR); // Read status register and update shadow register
if (!RXENERGYDET || !CONTA || !CONTB) // If rx energy or scram 1's are not detected
{
GPT1 = 24; // Restart scram 1's detect timer
}
if ((S27 & 0b11110000) == PROTB0) // Look for S1 Pattern if V22bis was selected
{
if (!FALLBACK) // If modulation fallback is not enabled
{ // prevent detection of V22 handshaking sequence
GPT1 = 24; // by restarting scram 1's detect timer
}
if (RXENERGYDET && S1DET)
{
gotS1pattern = 1; // Set flag to indicate S1 pattern was found
}
}
} while(GPT1 != 0 && !gotS1pattern); // Continue to loop until scram 1's detected for approx 270ms
if (gotS1pattern)
{
// Stage 3 If the S1 pattern was detected wait until it goes away
do { // Wait until end of S1 pattern
DelayMs(5); // Insert 5ms polling delay
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if wait carrier after dial timer has expired
}
CMXSTAT = rd16_cbus(CMXSTAT_ADDR); // Read status register and update shadow register
} while(S1DET); // Wait until S1 Pattern has gone
// Stage 4 Tx S1 pattern for 100ms
CMXTXMODE &= 0xFFF8; // Now Tx S1 pattern
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
GPT1 = 60; // Start 600ms timer
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if general purpose timer (S18) has expired
}
} while(GPT1 >= 50); // Wait for 100ms timer to expire
// Stage 5 Tx scrambled 1's
CMXTXMODE &= 0xFF98; // Unmask scrambler and Tx Data source bit settings
CMXTXMODE ^= 0x0067; // Scrambler enabled and Tx data byte
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
// Stage 6 Wait for 300ms timer to expire before enabling Rx Auto-Equaliser (will ensure it is receiving randomised data)
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if general purpose timer (S18) has expired
}
} while (GPT1 >= 30); // Wait until 300ms has expired
AUTO_EQU = 1; // Enable Rx Auto-Equaliser for training (must be enabled for 2400bps operation)
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
// Stage 7 wait for 450ms timer to expire
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if general purpose timer (S18) has expired
}
} while (GPT1 >= 15); // Wait until 450ms has expired
// Stage 8 Switch Rx Mode to 2400bps (Detectors and associated status flags will be reset)
CMXRXMODE &= 0x0FFF; // Unmask Rx Mode bit settings
CMXRXMODE ^= 0xE000; // Setup Rx for low band V.22bis 2400bps
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
// Stage 9 Wait until 32 continuous scram 1's at 2400bps are detected and the transmitter has switched to 2400bps scram 1's
do {
DelayMs(5); // Insert 5ms polling delay
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if wait carrier after dial timer has expired
}
if (!tx2400flag)
{
if (GPT1 == 0) // Check if 600ms timer has expired
{
CMXTXMODE &= 0x0FFF; // Unmask Tx Mode bit settings
CMXTXMODE ^= 0xF000; // Setup Tx for high band V.22 bis 2400bps
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
GPT1 = 20; // Load 200ms Timer
tx2400flag = 1;
}
}
CMXSTAT = rd16_cbus(CMXSTAT_ADDR); // Read status register and update shadow register
if (RXENERGYDET && CONTA && CONTB && !det32ones)
{
DCDN = 0; // Clear DCDN line.
DCDIND = 1; // Turn on CD LED.
det32ones = 1; // Set detect 32 1's flag
}
} while(!RXENERGYDET || !CONTA || !CONTB || !tx2400flag); // Wait until 2400bps cont 1's is detected and
// 2400bps has started transmitting
// Stage 10 Ensure final 200ms timer has expired
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if general purpose timer (S18) has expired
}
} while (GPT1 != 0); // Ensure 200ms timer has expired
}
else
{
// Stage 11 Tx scrambled 1's
CMXTXMODE &= 0xFF9F; // Unmask scrambler bit settings
CMXTXMODE ^= 0x0060; // Enable scrambler
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
AUTO_EQU = USER_AUTO_EQU; // Extract Auto Equaliser setting from S24.
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
// Stage 12 Wait for 770ms timer to expire
GPT1 = 77; // Start 770ms timer
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if general purpose timer (S18) has expired
}
} while (GPT1 != 0); // Wait until 770ms has expired
DCDN = 0; // Clear DCDN line.
DCDIND = 1; // Turn on CD LED.
}
// Stage 13
async_setup(); // Configure Tx/Rx for async operation (settings extracted from S25 and S26)
if (!gotS1pattern)
{
return(CON1200); // Return Connect 1200
}
else
{
return(CON2400); // Return Connect 2400
}
}
unsigned char ans_V23()
{
// Stage 1 Tx unscrambled cont 1's
CMXRXMODE &= 0x0E00; // Mask Rx Gain settings
CMXRXMODE ^= 0x4038; // Setup Rx for V23 75bps and auto-equaliser disabled
// Descrambler disabled, synchronous operation
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
CMXTXDATA = 0xFF;
wr_cbus(CMXTXDATA_ADDR,CMXTXDATA); // Ensure Tx data reg is all 1's
CMXTXMODE &= 0x0E00; // Mask Tx Gain settings
CMXTXMODE ^= 0x501F; // Setup Tx for V23 1200bps, no guard tones
// Scrambler disabled, sync operation, Tx data byte
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update CBUS register
// Stage 2 Detect unscram 1's for 150ms (use FSK demod output for this low baud rate detection)
GPT1 = 15; // Start timer
do {
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if GPT6 has expired
}
CMXSTAT = rd16_cbus(CMXSTAT_ADDR); // Read status register and update shadow register
if (!RXENERGYDET || !FSKOUT) // If rx energy not detected or FSK demod output low
{
GPT1 = 15; // Restart unscram 1's detect timer
}
} while(GPT1 != 0); // Continue to loop until unscram 1's detected for 150ms
// Stage 3
async_setup(); // Configure Tx/Rx for async operation (settings extracted from S25 and S26)
DCDN = 0; // Clear DCDN line.
DCDIND = 1; // Turn on CD LED.
return(CON120075); // Return Connect 1200/75
}
unsigned char ans_V23r()
{
return(NYI);
}
unsigned char ans_V22_600()
{
return(NYI);
}
unsigned char ans_V21()
{
return(NYI);
}
unsigned char ans_212a()
{
return(NYI);
}
unsigned char ans_202()
{
return(NYI);
}
unsigned char ans_202r()
{
return(NYI);
}
unsigned char ans_103()
{
// Stage 1 Tx unscrambled cont 1's
CMXRXMODE &= 0x0E00; // Mask Rx Gain settings
CMXRXMODE ^= 0x6038; // Setup Rx for low band Bell 103 300bps and auto-equaliser disabled
// Descrambler disabled, synchronous operation
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
CMXTXDATA = 0xFF;
wr16_cbus(CMXTXDATA_ADDR,CMXTXDATA); // Ensure Tx data reg is all 1's
CMXTXMODE &= 0x0E00; // Mask Tx Gain settings
CMXTXMODE ^= 0x701F; // Setup Tx for high band Bell 103 300bps, no guard tones
// Scrambler disabled, sync operation and Tx data byte
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update CBUS register
// Stage 2
if (unscram1sdet(5) != OK) return(NOCARRIER); // Detect unscram 1's for 150ms (1's detect has approx 100ms (32bits) response time)
// Stage 3
async_setup(); // Configure Tx/Rx for async operation (settings extracted from S25 and S26)
DCDN = 0; // Clear DCDN line.
DCDIND = 1; // Turn on CD LED.
return(CON300); // Return Connect 300
}
void async_setup()
{
CMXTXMODE &= 0xFFE0; // Unmask Tx Data format bit settings
CMXTXMODE ^= ((((int) S25) >> 3) & 0x001F); // Extract Tx Data/Stop bit and async mode settings from S25.
wr16_cbus(CMXTXMODE_ADDR,CMXTXMODE); // Update Tx Mode CBUS register
RXUSART = 1; // Ensure Rx USART is enabled
CMXRXMODE &= 0xFFE0; // Unmask Rx USART bit settings
CMXRXMODE ^= ((((int) S26) >> 3) & 0x001F); // Extract Rx Data/parity and async mode settings from S26.
wr16_cbus(CMXRXMODE_ADDR,CMXRXMODE); // Update Rx Mode CBUS register
}
unsigned char unscram1sdet(unsigned char dettime) // Uses general purpose timers GPT1 and GPT6
{
GPT1 = dettime; // Start timer
do {
DelayMs(5); // Insert 5ms polling delay
if (KEYABORT || (GPT6 == 0))
{ // Return No Carrier message if key pushed or
return(NOCARRIER); // if GPT6 has expired
}
CMXSTAT = rd16_cbus(CMXSTAT_ADDR); // Read status register and update shadow register
if (!RXENERGYDET || !CONTA || CONTB) // If rx energy or unscram 1's are not detected
{
GPT1 = dettime; // Restart unscram 1's detect timer
}
} while(GPT1 != 0); // Continue to loop until unscram 1's detected for specified time
return(OK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -