altos: Start making cc1120 radio work
[fw/altos] / src / drivers / ao_cc1120.c
index 5fe314c96130bfa02052134f9e69d89fa764c1eb..a1d78d9ca13aa331ca07ac061686415f2fc2509e 100644 (file)
@@ -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;
 }
@@ -254,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++) {
@@ -278,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();
 }
@@ -406,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,
@@ -433,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
@@ -484,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;
@@ -733,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]);
 }