Better fix for hardware FCS error on JTAG reset
Correct silly error introduced by trying to save two bytes.
This commit is contained in:
parent
63e40d195e
commit
fb977cb9ef
|
@ -232,13 +232,19 @@ hal_init(void)
|
||||||
// hal_reset_flags();
|
// hal_reset_flags();
|
||||||
|
|
||||||
/*IO Specific Initialization - sleep and reset pins. */
|
/*IO Specific Initialization - sleep and reset pins. */
|
||||||
|
/* Set pins low before they are initialized as output? Does not seem to matter */
|
||||||
|
// hal_set_rst_low();
|
||||||
|
// hal_set_slptr_low();
|
||||||
DDR_SLP_TR |= (1 << SLP_TR); /* Enable SLP_TR as output. */
|
DDR_SLP_TR |= (1 << SLP_TR); /* Enable SLP_TR as output. */
|
||||||
DDR_RST |= (1 << RST); /* Enable RST as output. */
|
DDR_RST |= (1 << RST); /* Enable RST as output. */
|
||||||
|
|
||||||
/*SPI Specific Initialization.*/
|
/*SPI Specific Initialization.*/
|
||||||
/* Set SS, CLK and MOSI as output. */
|
/* Set SS, CLK and MOSI as output. */
|
||||||
HAL_DDR_SPI |= (1 << HAL_DD_SS) | (1 << HAL_DD_SCK) | (1 << HAL_DD_MOSI);
|
/* To avoid a SPI glitch, the port register shall be set before the DDR register */
|
||||||
HAL_PORT_SPI |= (1 << HAL_DD_SS) | (1 << HAL_DD_SCK); /* Set SS and CLK high */
|
HAL_PORT_SPI |= (1 << HAL_DD_SS) | (1 << HAL_DD_SCK); /* Set SS and CLK high */
|
||||||
|
HAL_DDR_SPI |= (1 << HAL_DD_SS) | (1 << HAL_DD_SCK) | (1 << HAL_DD_MOSI);
|
||||||
|
HAL_DDR_SPI &=~ (1<< HAL_DD_MISO); /* MISO input */
|
||||||
|
|
||||||
/* Run SPI at max speed */
|
/* Run SPI at max speed */
|
||||||
SPCR = (1 << SPE) | (1 << MSTR); /* Enable SPI module and master operation. */
|
SPCR = (1 << SPE) | (1 << MSTR); /* Enable SPI module and master operation. */
|
||||||
SPSR = (1 << SPI2X); /* Enable doubled SPI speed in master mode. */
|
SPSR = (1 << SPI2X); /* Enable doubled SPI speed in master mode. */
|
||||||
|
|
|
@ -721,18 +721,29 @@ rf230_init(void)
|
||||||
{
|
{
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
DEBUGFLOW('i');
|
DEBUGFLOW('i');
|
||||||
|
/* A jtag or brownout reset of the mcu tristates the RF230 control pins while
|
||||||
|
* it is in operation, which can result in a mulfunctioning condition when the
|
||||||
|
* radio is later re-initialized.
|
||||||
|
* This manifests as an incorrectly computed hardware FCS checksum.
|
||||||
|
* Setting up the pins before the poweron time delay seems to fix this.
|
||||||
|
*/
|
||||||
|
#if 1 //this works after a brownout or jtag reset
|
||||||
|
/* Initialize Hardware Abstraction Layer */
|
||||||
|
hal_init();
|
||||||
/* Wait in case VCC just applied */
|
/* Wait in case VCC just applied */
|
||||||
delay_us(TIME_TO_ENTER_P_ON);
|
delay_us(TIME_TO_ENTER_P_ON);
|
||||||
|
#else //this gives FCS errors 5 out of 6 times
|
||||||
|
/* Wait in case VCC just applied */
|
||||||
|
delay_us(TIME_TO_ENTER_P_ON);
|
||||||
|
/* Initialize Hardware Abstraction Layer */
|
||||||
|
hal_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Calibrate oscillator */
|
/* Calibrate oscillator */
|
||||||
// printf_P(PSTR("\nBefore calibration OSCCAL=%x\n"),OSCCAL);
|
// printf_P(PSTR("\nBefore calibration OSCCAL=%x\n"),OSCCAL);
|
||||||
// calibrate_rc_osc_32k();
|
// calibrate_rc_osc_32k();
|
||||||
// printf_P(PSTR("After calibration OSCCAL=%x\n"),OSCCAL);
|
// printf_P(PSTR("After calibration OSCCAL=%x\n"),OSCCAL);
|
||||||
|
|
||||||
/* Initialize Hardware Abstraction Layer */
|
|
||||||
hal_init();
|
|
||||||
|
|
||||||
/* Set receive buffers empty and point to the first */
|
/* Set receive buffers empty and point to the first */
|
||||||
for (i=0;i<RF230_CONF_RX_BUFFERS;i++) rxframe[i].length=0;
|
for (i=0;i<RF230_CONF_RX_BUFFERS;i++) rxframe[i].length=0;
|
||||||
rxframe_head=0;rxframe_tail=0;
|
rxframe_head=0;rxframe_tail=0;
|
||||||
|
|
|
@ -167,19 +167,6 @@ uint8_t i,j;
|
||||||
/*------Done in a subroutine to keep main routine stack usage small--------*/
|
/*------Done in a subroutine to keep main routine stack usage small--------*/
|
||||||
void initialize(void)
|
void initialize(void)
|
||||||
{
|
{
|
||||||
/* A jtag or brownout reset of the mcu tristates the RF230 control pins while
|
|
||||||
* it is in operation, which can result in a mulfunctioning condition when the
|
|
||||||
* radio is later re-initialized.
|
|
||||||
* This manifests as an incorrectly computed hardware FCS checksum.
|
|
||||||
* Setting up the pins as soon as possible after mcu reset seems to fix this.
|
|
||||||
* Additionally, hold the radio in reset to prevent premature rx interrupts.
|
|
||||||
*/
|
|
||||||
#if RF230BB
|
|
||||||
#include "radio/rf230bb/hal.h"
|
|
||||||
hal_init();
|
|
||||||
hal_set_rst_low();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
watchdog_init();
|
watchdog_init();
|
||||||
watchdog_start();
|
watchdog_start();
|
||||||
|
|
||||||
|
@ -370,7 +357,7 @@ uint8_t i;
|
||||||
{
|
{
|
||||||
#if AVR_WEBSERVER
|
#if AVR_WEBSERVER
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
char buf[80];
|
char buf1[40],buf[40];
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
|
|
||||||
for (i=0;i<UIP_DS6_ADDR_NB;i++) {
|
for (i=0;i<UIP_DS6_ADDR_NB;i++) {
|
||||||
|
@ -380,11 +367,11 @@ uint8_t i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cli();
|
cli();
|
||||||
eeprom_read_block (buf,eemem_server_name, sizeof(eemem_server_name));
|
eeprom_read_block (buf1,eemem_server_name, sizeof(eemem_server_name));
|
||||||
eeprom_read_block (buf,eemem_domain_name, sizeof(eemem_domain_name));
|
eeprom_read_block (buf,eemem_domain_name, sizeof(eemem_domain_name));
|
||||||
sei();
|
sei();
|
||||||
buf[sizeof(eemem_server_name)]=0;
|
buf1[sizeof(eemem_server_name)]=0;
|
||||||
PRINTA("%s",buf);
|
PRINTA("%s",buf1);
|
||||||
buf[sizeof(eemem_domain_name)]=0;
|
buf[sizeof(eemem_domain_name)]=0;
|
||||||
size=httpd_fs_get_size();
|
size=httpd_fs_get_size();
|
||||||
#ifndef COFFEE_FILES
|
#ifndef COFFEE_FILES
|
||||||
|
@ -491,7 +478,7 @@ main(void)
|
||||||
if ((clocktime%STAMPS)==0) {
|
if ((clocktime%STAMPS)==0) {
|
||||||
#if ENERGEST_CONF_ON
|
#if ENERGEST_CONF_ON
|
||||||
#include "lib/print-stats.h"
|
#include "lib/print-stats.h"
|
||||||
// print_stats();
|
print_stats();
|
||||||
#elif RADIOSTATS
|
#elif RADIOSTATS
|
||||||
extern volatile unsigned long radioontime;
|
extern volatile unsigned long radioontime;
|
||||||
PRINTF("%u(%u)s\n",clocktime,radioontime);
|
PRINTF("%u(%u)s\n",clocktime,radioontime);
|
||||||
|
|
Loading…
Reference in a new issue