X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fdrivers%2Fao_cc1120.c;h=a1d78d9ca13aa331ca07ac061686415f2fc2509e;hb=e09e35471e788b88909ff01037fb8e0e4eabcd7d;hp=95b21170f597e0b1c468cef9e1d3f97a13c5b014;hpb=6a973f788563ccc66b01cc7557a004dabef18d09;p=fw%2Faltos diff --git a/src/drivers/ao_cc1120.c b/src/drivers/ao_cc1120.c index 95b21170..a1d78d9c 100644 --- a/src/drivers/ao_cc1120.c +++ b/src/drivers/ao_cc1120.c @@ -25,7 +25,7 @@ uint8_t ao_radio_abort; #define CC1120_DEBUG 1 -uint32_t ao_radio_cal = 1186611; +uint32_t ao_radio_cal = 0x6ca333; #define FOSC 32000000 @@ -77,13 +77,13 @@ ao_radio_reg_write(uint16_t addr, uint8_t value) printf("\t\tao_radio_reg_write (%04x): %02x\n", addr, value); #endif if (CC1120_IS_EXTENDED(addr)) { - data[0] = ((1 << CC1120_READ) | + data[0] = ((0 << CC1120_READ) | (0 << CC1120_BURST) | CC1120_EXTENDED); data[1] = addr; d = 2; } else { - data[0] = ((1 << CC1120_READ) | + data[0] = ((0 << CC1120_READ) | (0 << CC1120_BURST) | addr); d = 1; @@ -106,7 +106,7 @@ ao_radio_strobe(uint8_t addr) ao_radio_duplex(&addr, &in, 1); ao_radio_deselect(); #if CC1120_DEBUG - printf("%02x\n", in); + printf("%02x\n", in); flush(); #endif return in; } @@ -197,8 +197,8 @@ ao_radio_recv_abort(void) * * To make the tone last for 200ms, we need 2000 * .2 = 400 bits or 50 bytes */ -#define RDF_DRATE_E 6 -#define RDF_DRATE_M 511705 +#define RDF_DRATE_E 5 +#define RDF_DRATE_M 25166 #define RDF_PACKET_LEN 50 static const uint16_t rdf_setup[] = { @@ -216,6 +216,11 @@ static const uint16_t rdf_setup[] = { (CC1120_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1120_PKT_CFG1_ADDR_CHECK_CFG) | (CC1120_PKT_CFG1_CRC_CFG_DISABLED << CC1120_PKT_CFG1_CRC_CFG) | (0 << CC1120_PKT_CFG1_APPEND_STATUS)), + CC1120_PKT_CFG0, ((0 << CC1120_PKT_CFG0_RESERVED7) | + (CC1120_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1120_PKT_CFG0_LENGTH_CONFIG) | + (0 << CC1120_PKT_CFG0_PKG_BIT_LEN) | + (0 << CC1120_PKT_CFG0_UART_MODE_EN) | + (0 << CC1120_PKT_CFG0_UART_SWAP_EN)), }; #define int_pin(w) printf("\t%s: %d\n", \ @@ -249,15 +254,33 @@ ao_radio_rdf(uint8_t len) ao_radio_abort = 0; for (i = 0; i < sizeof (rdf_setup) / sizeof (rdf_setup[0]); i += 2) ao_radio_reg_write(rdf_setup[i], rdf_setup[i+1]); - ao_radio_reg_write(CC1120_PKT_LEN, len); + +#if 0 int_pin ("Before CFG"); ao_radio_reg_write(CC1120_IOCFG2, CC1120_IOCFG_GPIO_CFG_RX0TX1_CFG); int_pin ("After CFG"); +#endif + + ao_radio_fifo_write_fixed(ao_radio_rdf_value, len); + + ao_radio_reg_write(CC1120_PKT_LEN, len); + + printf ("packet length: %d\n", ao_radio_reg_read(CC1120_PKT_LEN)); + ao_radio_strobe(CC1120_STX); + + for (i = 0; i < 20; i++) { + printf ("%d ", i); flush(); + printf ("Status %02x ", ao_radio_status()); flush(); + printf ("num_tx_bytes %d ", ao_radio_reg_read(CC1120_NUM_TXBYTES)); flush(); + printf ("marc status %x\n", ao_radio_marc_status()); flush(); + ao_delay(AO_MS_TO_TICKS(50)); + } + +#if 0 ao_exti_enable(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN); int_pin ("After strobe"); ao_delay(AO_MS_TO_TICKS(100)); - ao_radio_fifo_write_fixed(ao_radio_rdf_value, len); int_pin ("After delay"); cli(); for (i = 0; i < 20; i++) { @@ -273,11 +296,14 @@ ao_radio_rdf(uint8_t len) #endif } sei(); +#endif printf ("num_tx_bytes %d marc status %x\n", ao_radio_reg_read(CC1120_NUM_TXBYTES), ao_radio_marc_status()); +#if 0 if (!ao_radio_tx_done()) ao_radio_idle(); +#endif ao_radio_set_packet(); ao_radio_put(); } @@ -401,17 +427,16 @@ ao_radio_recv(__xdata void *d, uint8_t size) /* * For our packet data, set the symbol rate to 38360 Baud * - * (2**20 - DATARATE_M) * 2 ** DATARATE_E + * (2**20 + DATARATE_M) * 2 ** DATARATE_E * Rdata = -------------------------------------- * fosc * 2 ** 39 * - * DATARATE_M = 405002 - * DATARATE_E = 10 * - * To make the tone last for 200ms, we need 2000 * .2 = 400 bits or 50 bytes + * DATARATE_M = 239914 + * DATARATE_E = 9 */ -#define PACKET_DRATE_E 10 -#define PACKET_DRATE_M 405002 +#define PACKET_DRATE_E 9 +#define PACKET_DRATE_M 239914 static const uint16_t packet_setup[] = { CC1120_DEVIATION_M, PACKET_DEV_M, @@ -428,6 +453,11 @@ static const uint16_t packet_setup[] = { (CC1120_PKT_CFG1_ADDR_CHECK_CFG_NONE << CC1120_PKT_CFG1_ADDR_CHECK_CFG) | (CC1120_PKT_CFG1_CRC_CFG_DISABLED << CC1120_PKT_CFG1_CRC_CFG) | (1 << CC1120_PKT_CFG1_APPEND_STATUS)), + CC1120_PKT_CFG0, ((0 << CC1120_PKT_CFG0_RESERVED7) | + (CC1120_PKT_CFG0_LENGTH_CONFIG_FIXED << CC1120_PKT_CFG0_LENGTH_CONFIG) | + (0 << CC1120_PKT_CFG0_PKG_BIT_LEN) | + (0 << CC1120_PKT_CFG0_UART_MODE_EN) | + (0 << CC1120_PKT_CFG0_UART_SWAP_EN)), }; void @@ -479,8 +509,8 @@ ao_radio_setup(void) ao_radio_reg_write(CC1120_IOCFG2, CC1120_IOCFG_GPIO_CFG_MARC_MCU_WAKEUP); /* Enable the EXTI interrupt for the appropriate pin */ - ao_enable_port(AO_CC1120_INT_PORT); - ao_exti_setup(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN, AO_EXTI_MODE_FALLING, ao_radio_isr); +// ao_enable_port(AO_CC1120_INT_PORT); +// ao_exti_setup(&AO_CC1120_INT_PORT, AO_CC1120_INT_PIN, AO_EXTI_MODE_FALLING, ao_radio_isr); ao_radio_set_packet(); ao_radio_configured = 1; @@ -492,6 +522,9 @@ ao_radio_get(uint8_t len) ao_mutex_get(&ao_radio_mutex); if (!ao_radio_configured) ao_radio_setup(); + ao_radio_reg_write(CC1120_FREQ2, ao_config.radio_setting >> 16); + ao_radio_reg_write(CC1120_FREQ1, ao_config.radio_setting >> 8); + ao_radio_reg_write(CC1120_FREQ0, ao_config.radio_setting); ao_radio_reg_write(CC1120_PKT_LEN, len); } @@ -717,7 +750,7 @@ static const struct ao_cmds ao_radio_cmds[] = { { ao_radio_test, "C <1 start, 0 stop, none both>\0Radio carrier test" }, #if CC1120_DEBUG { ao_radio_show, "R\0Show CC1120 status" }, - { ao_radio_beep, "B\0Emit an RDF beacon" }, + { ao_radio_beep, "b\0Emit an RDF beacon" }, #endif { 0, NULL } }; @@ -725,8 +758,18 @@ static const struct ao_cmds ao_radio_cmds[] = { void ao_radio_init(void) { + int i; + ao_radio_configured = 0; ao_spi_init_cs (AO_CC1120_SPI_CS_PORT, (1 << AO_CC1120_SPI_CS_PIN)); + AO_CC1120_SPI_CS_PORT.bsrr = ((uint32_t) (1 << AO_CC1120_SPI_CS_PIN)); + for (i = 0; i < 10000; i++) { + if ((SPI_2_GPIO.idr & (1 << SPI_2_MISO)) == 0) + break; + } + AO_CC1120_SPI_CS_PORT.bsrr = (1 << AO_CC1120_SPI_CS_PIN); + if (i == 10000) + ao_panic(AO_PANIC_SELF_TEST); ao_cmd_register(&ao_radio_cmds[0]); }