[new] XBee auto-baudrate in api mode

This commit is contained in:
Christophe De Wagter
2013-02-25 16:32:05 +01:00
committed by Felix Ruess
parent 03c78067a2
commit a7139f9bdb
3 changed files with 78 additions and 10 deletions
@@ -3,7 +3,7 @@
# XBee modems in API mode
ap.CFLAGS += -DUSE_$(MODEM_PORT)
ap.CFLAGS += -D$(MODEM_PORT)_BAUD=$(MODEM_BAUD)
ap.CFLAGS += -D$(MODEM_PORT)_BAUD=$(MODEM_BAUD) -DXBEE_BAUD=$(MODEM_BAUD)
ap.CFLAGS += -DDOWNLINK -DDOWNLINK_FBW_DEVICE=$(MODEM_PORT) -DDOWNLINK_AP_DEVICE=$(MODEM_PORT) -DXBEE_UART=$(MODEM_PORT)
ap.CFLAGS += -DDOWNLINK_TRANSPORT=XBeeTransport -DDATALINK=XBEE
@@ -7,7 +7,7 @@
#
ap.CFLAGS += -DUSE_$(MODEM_PORT)
ap.CFLAGS += -D$(MODEM_PORT)_BAUD=$(MODEM_BAUD)
ap.CFLAGS += -D$(MODEM_PORT)_BAUD=$(MODEM_BAUD) -DXBEE_BAUD=$(MODEM_BAUD)
ap.CFLAGS += -DDOWNLINK -DDOWNLINK_DEVICE=$(MODEM_PORT) -DXBEE_UART=$(MODEM_PORT)
ap.CFLAGS += -DDOWNLINK_TRANSPORT=XBeeTransport -DDATALINK=XBEE
+76 -8
View File
@@ -34,21 +34,30 @@ uint8_t xbee_rssi;
struct xbee_transport xbee_tp;
#define AT_COMMAND_SEQUENCE "+++"
#define AT_INIT_PERIOD_US 2000000
#define AT_SET_MY "ATMY"
#define AT_AP_MODE "ATAP1\r"
#define AT_EXIT "ATCN\r"
uint32_t xbee_delay_time;
static uint8_t xbee_text_reply_is_ok(void)
{
char c[2];
int count = 0;
while (TransportLink(XBEE_UART,ChAvailable()))
{
char cc = TransportLink(XBEE_UART,Getch());
if (count < 2)
c[count] = cc;
count++;
}
void xbee_init( void ) {
xbee_tp.status = XBEE_UNINIT;
xbee_tp.trans.msg_received = FALSE;
if ((count > 2) && (c[0] == 'O') && (c[1] == 'K'))
return TRUE;
#ifndef NO_XBEE_API_INIT
/** - busy wait 1.25s */
sys_time_usleep(1250000);
return FALSE;
}
static uint8_t xbee_try_to_enter_api(void) {
/** Switching to AT mode (FIXME: busy waiting) */
XBeePrintString(XBEE_UART,AT_COMMAND_SEQUENCE);
@@ -56,6 +65,62 @@ void xbee_init( void ) {
/** - busy wait 1.25s */
sys_time_usleep(1250000);
return xbee_text_reply_is_ok();
}
#define XBeeUartSetBaudrate(_a) TransportLink(XBEE_UART,SetBaudrate(_a))
#if XBEE_BAUD == B9600
#define XBEE_BAUD_ALTERNATE B57600
#define XBEE_ATBD_CODE "ATBD3\rATWR\r"
#pragma message "Experimental: XBEE-API@9k6 auto-baudrate 57k6 -> 9k6 (stop ground link for correct operation)"
#elif XBEE_BAUD == B57600
#define XBEE_BAUD_ALTERNATE B9600
#define XBEE_ATBD_CODE "ATBD6\rATWR\r"
#pragma message "Experimental: XBEE-API@57k6 auto-baudrate 9k6 -> 57k6 (stop ground link for correct operation)"
#else
#warning XBEE-API Non default baudrate: auto-baud disabled
#endif
void xbee_init( void ) {
xbee_tp.status = XBEE_UNINIT;
xbee_tp.trans.msg_received = FALSE;
// Empty buffer before init process
while (TransportLink(XBEE_UART,ChAvailable()))
TransportLink(XBEE_UART,Getch());
#ifndef NO_XBEE_API_INIT
/** - busy wait 1.25s */
sys_time_usleep(1250000);
if (! xbee_try_to_enter_api() )
{
#ifdef XBEE_BAUD_ALTERNATE
// Badly configured... try the alternate baudrate:
XBeeUartSetBaudrate(XBEE_BAUD_ALTERNATE);
if ( xbee_try_to_enter_api() )
{
// The alternate baudrate worked,
XBeePrintString(XBEE_UART,XBEE_ATBD_CODE);
}
else
{
// Complete failure, none of the 2 baudrates result in any reply
// TODO: set LED?
// Set the default baudrate, just in case everything is right
XBeeUartSetBaudrate(XBEE_BAUD);
XBeePrintString(XBEE_UART,"\r");
}
#endif
// Continue changing settings until the EXIT is issued.
}
/** Setting my address */
XBeePrintString(XBEE_UART,AT_SET_MY);
uint16_t addr = XBEE_MY_ADDR;
@@ -70,5 +135,8 @@ void xbee_init( void ) {
/** Switching back to normal mode */
XBeePrintString(XBEE_UART,AT_EXIT);
XBeeUartSetBaudrate(XBEE_BAUD);
#endif
}