Home/Support/Support Forum/How do I go about configuring SDLC on Serial Port F of a Rabbit 6000?
Welcome to Digi Forum, where you can ask questions and receive answers from other members of the community.

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

0 votes
Greetings,

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.

Thanks,

Nick
asked Aug 20, 2013 in Rabbit Software by ndjankov New to the Community (3 points)
reshown Sep 2, 2013 by kavya

Please log in or register to answer this question.

3 Answers

0 votes
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:

/**********************************************************
hdlc_test.c
Z-World, 2002

This program is used with Rabbit 3000 based controllers.

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

Instructions
============
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
//#define USE_HDLC_SERIALPORTE
#define USE_HDLC_SERIALPORTF

#ifdef USE_HDLC_SERIALPORTE
#ifdef USE_HDLC_SERIALPORTF
#warnt "Not set up to use both serial ports E and F, using only serial port E."
#endif
#define HDLCopenX HDLCopenE
#define HDLCsendingX HDLCsendingE
#define HDLCsendX HDLCsendE
#define HDLCerrorX HDLCerrorE
#define HDLCpeekX HDLCpeekE
#define HDLCdropX HDLCdropE
#else
#ifdef USE_HDLC_SERIALPORTF
#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
#else
#warnt "Must use either serial port E or serial port F."
#endif
#endif

#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));
HDLCopenX( BAUD_RATE,
HDLC_NRZ,
xbuffers,
BUFFER_COUNT,
BUFFER_SIZE );
counter = 1;
recv_count = 0;

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

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

if(HDLCsendX(tx_packet, strlen(tx_packet)) == 1)
{
counter++;
}
else
{
printf("Packet not sent\n");
}
}

errors = HDLCerrorX();
if(errors)
{
printf("ERROR 0x%x\n", errors);
}

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

if(packet_size > 0)
{
rx_packet[packet_size] = 0;
printf("Got packet(%d): '%s'\n", packet_size, rx_packet);
}
}
}
answered Sep 3, 2013 by ndjankov New to the Community (3 points)
0 votes
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.
answered Oct 3, 2013 by ndjankov New to the Community (3 points)
0 votes
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)
answered Oct 7, 2013 by ndjankov New to the Community (3 points)
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

thanks..
...