How do I go about configuring SDLC on Serial Port F of a Rabbit 6000?


I am in the process of connecting my RCM6700 dev kit to an full-duplex SDLC device. I have figured out how to make the electrical connections, but I am not quite sure how to configure the rabbit core to use SDLC on Serial Port F.

I see that there is an HDLC library that comes with Dynamic C, but I could not find any examples that use it, nor am I sure how to use this library to talk SDLC.

Any additional information/documentation would be greatly appreciated.



Well, I found that HDLC is compatible with SDLC for my purposes, so the HDLC library would be sufficient if I could get it to work.

I did find an old HDLC test example for 3000 series chips (see below), but the library should make the Rabbit 6000 transparent, assuming that I could get the port configured correctly.

I made some changes to this test program to have Serial Port F use pins PC0 through PC3, but these do not seem to work (see below).

I was able to verify that the pins work in a RS232 loopback test; however, when I load the HDLS loopback program, there are no signals on these pins.

I still must be missing something to properly configure HDLC on Serial Port F to use Port C … any suggestions?

Sample Source Code:

Z-World, 2002

This program is used with Rabbit 3000 based controllers.  

This program demonstrates a simple loopback test on  
either serial port E or serial port F in HDLC mode.  

1. Simply connect PG6 (TXE) to PG7 (RXE) to use serial port E,  
   or connect PG2 (TXF) to PG3 (RXF) to use serial port F.  
2. Compile and run this program.  
3. Packets are sent out and received on the same port.  

#class auto

#use hdlc_packet.lib

// uncomment only one of the following two macro definitions

#warnt “Not set up to use both serial ports E and F, using only serial port E.”
#define HDLCopenX HDLCopenE
#define HDLCsendingX HDLCsendingE
#define HDLCsendX HDLCsendE
#define HDLCerrorX HDLCerrorE
#define HDLCpeekX HDLCpeekE
#define HDLCdropX HDLCdropE
#define HDLC_F_USEPORT C //NDJ: added this line (as per HDLC_PACKET.LIB, loopback wired PC0 to PC1 and PC2 to)
#define SERF_TXPORT PCDR //NDJ: added this line (as per page 34 of MiniCore RCM5700/RCM6700 User’s Manual)
#define SERF_RXPORT PCDR //NDJ: added this line (as per page 34 of MiniCore RCM5700/RCM6700 User’s Manual)
#define HDLCopenX HDLCopenF
#define HDLCsendingX HDLCsendingF
#define HDLCsendX HDLCsendF
#define HDLCerrorX HDLCerrorF
#define HDLCpeekX HDLCpeekF
#define HDLCdropX HDLCdropF
#warnt “Must use either serial port E or serial port F.”

#define BUFFER_COUNT 4
#define BUFFER_SIZE 100
#define BAUD_RATE 153600L //NDJ: changed Baud rate

void main()
char tx_packet[100];
char rx_packet[100];
int packet_size;
unsigned long xbuffers;
char errors;
int counter;
unsigned long t;
int temp_flags;
int temp_length;
int i;
int recv_count;
unsigned long peekaddr;
int peeklen;

xbuffers = xalloc(BUFFER_COUNT * (BUFFER_SIZE + 4));   
                BUFFER_SIZE );   
counter = 1;   
recv_count = 0;   

    if(HDLCsendingX() == 0)   
        for(i = 0;i < 10;i++)   
            tx_packet[i] = '0' + (counter % 10);   
        tx_packet[10] = 0;   

        strcpy(tx_packet, "CatMouse987654321");   
        printf("Sending packet '%s', length:%d

", tx_packet, strlen(tx_packet));

        if(HDLCsendX(tx_packet, strlen(tx_packet)) == 1)   
            printf("Packet not sent


    errors = HDLCerrorX();   
        printf("ERROR 0x%x

", errors);

    //use the more efficient peek method   
    if(HDLCpeekX(&peekaddr, &peeklen))   
        xmem2root(rx_packet, peekaddr, peeklen);   
        packet_size = peeklen;   
        packet_size = 0;   

    if(packet_size > 0)   
        rx_packet[packet_size] = 0;   
        printf("Got packet(%d): '%s'

", packet_size, rx_packet);

I finally back to working on this. It turns out I just needed to configure Parallel Port C for the alternative function by adding “WrPortI(PCALR, NULL, 0xFF);” at the beginning of the loopback program.

Actually, that didn’t quite work out, but it was on the right track. There were a few more port configuration that need to be set to get things working. After calling HDLCopenX(), you need to configure the following registers:

PCALR = 0xFF (set PC0-PC4 to HDLC alternative mode)
PCAHR = 0x00 (leave in default mode)
PCFR = 0x0F (enable alternative functionality)
PCDDR = 0x05 (set in/out directions)
SFCR = 0x0D (choose parallel port C pins for serial port F)
SFER = 0x00 (I used default HDLC configurations)

RCM6700 core module & interface board …
Serial Port F, HDLC mode test …
Above example… After calling HDLCopenX() …

WrPortI(PEALR, NULL, 0x7F); // set PE0-PE2 to HDLC alternative mode */
WrPortI(PEAHR, NULL, 0x00); // leave in default mode
WrPortI(PEFR , NULL, 0x07); // enable alternative functionality
WrPortI(PEDDR, NULL, 0x05); // set in/out directions
WrPortI(SFCR, NULL, 0x6D); // choose parallel port E pins for serial port F
WrPortI(SFER, NULL, 0x00); //I used default HDLC configurations