CC3000 test App
Dependencies: CC3000HostDriver mbed
CC3000Core.cpp@2:17c37c0b0534, 2013-09-14 (annotated)
- Committer:
- dflet
- Date:
- Sat Sep 14 18:02:36 2013 +0000
- Revision:
- 2:17c37c0b0534
- Parent:
- 1:ee5703f58be3
Removed last change as its not required, problems I encountered were due to too many debug printouts.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dflet | 0:305844973572 | 1 | |
dflet | 0:305844973572 | 2 | |
dflet | 0:305844973572 | 3 | |
dflet | 0:305844973572 | 4 | #include "mbed.h" |
dflet | 0:305844973572 | 5 | #include "wlan.h" |
dflet | 0:305844973572 | 6 | #include "cc3000.h" |
dflet | 0:305844973572 | 7 | #include "CC3000Core.h" |
dflet | 0:305844973572 | 8 | #include "hci.h" |
dflet | 0:305844973572 | 9 | #include "CC3000TestApp.h" |
dflet | 0:305844973572 | 10 | #include "spi.h" |
dflet | 0:305844973572 | 11 | #include "DigitalClass.h" |
dflet | 0:305844973572 | 12 | |
dflet | 0:305844973572 | 13 | extern volatile unsigned long ulSmartConfigFinished; |
dflet | 0:305844973572 | 14 | volatile unsigned long //ulSmartConfigFinished, |
dflet | 0:305844973572 | 15 | ulCC3000Connected, |
dflet | 0:305844973572 | 16 | ulCC3000DHCP, |
dflet | 0:305844973572 | 17 | OkToDoShutDown, |
dflet | 0:305844973572 | 18 | ulCC3000DHCP_configured; |
dflet | 0:305844973572 | 19 | |
dflet | 0:305844973572 | 20 | volatile unsigned char ucStopSmartConfig; |
dflet | 0:305844973572 | 21 | |
dflet | 0:305844973572 | 22 | #define NETAPP_IPCONFIG_MAC_OFFSET (20) |
dflet | 0:305844973572 | 23 | #define CC3000_APP_BUFFER_SIZE (5) |
dflet | 0:305844973572 | 24 | #define CC3000_RX_BUFFER_OVERHEAD_SIZE (20) |
dflet | 0:305844973572 | 25 | |
dflet | 0:305844973572 | 26 | DigitalClass Dio(p9, p10); |
dflet | 0:305844973572 | 27 | InterruptIn irq(p9); |
dflet | 0:305844973572 | 28 | /* |
dflet | 0:305844973572 | 29 | unsigned char pucCC3000_Rx_Buffer[CC3000_APP_BUFFER_SIZE + CC3000_RX_BUFFER_OVERHEAD_SIZE]; |
dflet | 0:305844973572 | 30 | */ |
dflet | 0:305844973572 | 31 | |
dflet | 0:305844973572 | 32 | /* The original version of the function below had Serial.prints() |
dflet | 0:305844973572 | 33 | to display an event, but since an async event can happen at any time, |
dflet | 0:305844973572 | 34 | even in the middle of another Serial.print(), sometimes the sketch |
dflet | 0:305844973572 | 35 | would lock up because we were trying to print in the middle of |
dflet | 0:305844973572 | 36 | a print. |
dflet | 0:305844973572 | 37 | |
dflet | 0:305844973572 | 38 | So now we just set a flag and write to a string, and the master |
dflet | 0:305844973572 | 39 | loop can deal with it when it wants. |
dflet | 0:305844973572 | 40 | */ |
dflet | 0:305844973572 | 41 | int8_t asyncNotificationWaiting=false; |
dflet | 0:305844973572 | 42 | long lastAsyncEvent; |
dflet | 0:305844973572 | 43 | int8_t dhcpIPAddress[4]; |
dflet | 0:305844973572 | 44 | |
dflet | 0:305844973572 | 45 | |
dflet | 0:305844973572 | 46 | |
dflet | 0:305844973572 | 47 | |
dflet | 0:305844973572 | 48 | |
dflet | 0:305844973572 | 49 | |
dflet | 0:305844973572 | 50 | |
dflet | 0:305844973572 | 51 | |
dflet | 0:305844973572 | 52 | /*------------------------------------------------------------------- |
dflet | 0:305844973572 | 53 | |
dflet | 0:305844973572 | 54 | The TI library calls this routine when asynchronous events happen. |
dflet | 0:305844973572 | 55 | |
dflet | 0:305844973572 | 56 | For example you tell the CC3000 to turn itself on and connect |
dflet | 0:305844973572 | 57 | to an access point then your code can go on to do its own thing. |
dflet | 0:305844973572 | 58 | When the CC3000 is done configuring itself (e.g. it gets an IP |
dflet | 0:305844973572 | 59 | address from the DHCP server) it will call this routine so you |
dflet | 0:305844973572 | 60 | can take appropriate action. |
dflet | 0:305844973572 | 61 | |
dflet | 0:305844973572 | 62 | ---------------------------------------------------------------------*/ |
dflet | 0:305844973572 | 63 | |
dflet | 0:305844973572 | 64 | |
dflet | 0:305844973572 | 65 | void CC3000_AsynchCallback(long lEventType, char * data, unsigned char length) { |
dflet | 0:305844973572 | 66 | |
dflet | 0:305844973572 | 67 | switch (lEventType) { |
dflet | 0:305844973572 | 68 | |
dflet | 0:305844973572 | 69 | case HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE: |
dflet | 0:305844973572 | 70 | ulSmartConfigFinished = 1; |
dflet | 0:305844973572 | 71 | ucStopSmartConfig = 1; |
dflet | 0:305844973572 | 72 | printf("CC3000 Async event: Simple config done\r\n"); |
dflet | 0:305844973572 | 73 | break; |
dflet | 0:305844973572 | 74 | |
dflet | 0:305844973572 | 75 | case HCI_EVNT_WLAN_UNSOL_CONNECT: |
dflet | 0:305844973572 | 76 | ulCC3000Connected = 1; |
dflet | 0:305844973572 | 77 | setCC3000MachineState(CC3000_INIT); |
dflet | 0:305844973572 | 78 | printf("CC3000 Async event: Unsolicited connect\r\n"); |
dflet | 0:305844973572 | 79 | setCC3000MachineState(CC3000_ASSOC); |
dflet | 0:305844973572 | 80 | break; |
dflet | 0:305844973572 | 81 | |
dflet | 0:305844973572 | 82 | case HCI_EVNT_WLAN_UNSOL_DISCONNECT: |
dflet | 0:305844973572 | 83 | ulCC3000Connected = 0; |
dflet | 0:305844973572 | 84 | ulCC3000DHCP = 0; |
dflet | 0:305844973572 | 85 | ulCC3000DHCP_configured = 0; |
dflet | 0:305844973572 | 86 | unsetCC3000MachineState(CC3000_ASSOC); |
dflet | 0:305844973572 | 87 | printf("CC3000 Async event: Unsolicted disconnect\r\n"); |
dflet | 0:305844973572 | 88 | break; |
dflet | 0:305844973572 | 89 | |
dflet | 0:305844973572 | 90 | case HCI_EVNT_WLAN_UNSOL_DHCP: |
dflet | 0:305844973572 | 91 | // Notes: |
dflet | 0:305844973572 | 92 | // 1) IP config parameters are received swapped |
dflet | 0:305844973572 | 93 | // 2) IP config parameters are valid only if status is OK, i.e. ulCC3000DHCP becomes 1 |
dflet | 0:305844973572 | 94 | // only if status is OK, the flag is set to 1 and the addresses are valid |
dflet | 0:305844973572 | 95 | if ( *(data + NETAPP_IPCONFIG_MAC_OFFSET) == 0) { |
dflet | 0:305844973572 | 96 | ulCC3000DHCP = 1; |
dflet | 0:305844973572 | 97 | setCC3000MachineState(CC3000_IP_ALLOC); |
dflet | 0:305844973572 | 98 | printf("CC3000 Async event: Got IP address via DHCP: "); |
dflet | 0:305844973572 | 99 | printf("%i",data[3]); printf("."); |
dflet | 0:305844973572 | 100 | printf("%i",data[2]); printf("."); |
dflet | 0:305844973572 | 101 | printf("%i",data[1]); printf("."); |
dflet | 0:305844973572 | 102 | printf("%i",data[0]); |
dflet | 0:305844973572 | 103 | printf("\r\n"); |
dflet | 0:305844973572 | 104 | } |
dflet | 0:305844973572 | 105 | else { |
dflet | 0:305844973572 | 106 | ulCC3000DHCP = 0; |
dflet | 0:305844973572 | 107 | printf("CC3000 Async event: Unsolicited DHCP, no IP address\r\n"); |
dflet | 0:305844973572 | 108 | } |
dflet | 0:305844973572 | 109 | break; |
dflet | 0:305844973572 | 110 | |
dflet | 0:305844973572 | 111 | case HCI_EVENT_CC3000_CAN_SHUT_DOWN: |
dflet | 0:305844973572 | 112 | OkToDoShutDown = 1; |
dflet | 0:305844973572 | 113 | printf("CC3000 Async event: OK to shut down\r\n"); |
dflet | 0:305844973572 | 114 | break; |
dflet | 0:305844973572 | 115 | |
dflet | 0:305844973572 | 116 | } |
dflet | 0:305844973572 | 117 | } |
dflet | 0:305844973572 | 118 | |
dflet | 0:305844973572 | 119 | |
dflet | 0:305844973572 | 120 | |
dflet | 0:305844973572 | 121 | long ReadWlanInterruptPin(void) { |
dflet | 0:305844973572 | 122 | int8_t val; |
dflet | 0:305844973572 | 123 | //printf("WLAN_IRQ %i \r\n",Dio.WLAN_IRQ.read()); |
dflet | 0:305844973572 | 124 | val = Dio.WLAN_IRQ.read(); |
dflet | 0:305844973572 | 125 | return (long)val; |
dflet | 0:305844973572 | 126 | } |
dflet | 0:305844973572 | 127 | |
dflet | 0:305844973572 | 128 | |
dflet | 0:305844973572 | 129 | void WriteWlanPin( unsigned char val ) { |
dflet | 0:305844973572 | 130 | |
dflet | 0:305844973572 | 131 | if (val) { |
dflet | 0:305844973572 | 132 | Dio.WLAN_EN = 1; |
dflet | 0:305844973572 | 133 | //printf("WLAN_EN %i \r\n",val); |
dflet | 0:305844973572 | 134 | } |
dflet | 0:305844973572 | 135 | else { |
dflet | 0:305844973572 | 136 | Dio.WLAN_EN = 0; |
dflet | 0:305844973572 | 137 | //printf("WLAN_EN %i \r\n",val); |
dflet | 0:305844973572 | 138 | } |
dflet | 0:305844973572 | 139 | } |
dflet | 0:305844973572 | 140 | |
dflet | 0:305844973572 | 141 | void WlanInterruptEnable(void) { |
dflet | 1:ee5703f58be3 | 142 | |
dflet | 1:ee5703f58be3 | 143 | int8_t val; |
dflet | 0:305844973572 | 144 | irq.fall(&IntSpi); |
dflet | 1:ee5703f58be3 | 145 | |
dflet | 0:305844973572 | 146 | //__enable_irq(); //Enable Interrupts |
dflet | 0:305844973572 | 147 | //SPIInterruptsEnabled = 1; |
dflet | 1:ee5703f58be3 | 148 | } |
dflet | 0:305844973572 | 149 | |
dflet | 0:305844973572 | 150 | |
dflet | 0:305844973572 | 151 | void WlanInterruptDisable(void) { |
dflet | 0:305844973572 | 152 | |
dflet | 0:305844973572 | 153 | irq.fall(NULL); |
dflet | 0:305844973572 | 154 | |
dflet | 0:305844973572 | 155 | //__disable_irq(); //Disable Interrupts |
dflet | 0:305844973572 | 156 | //SPIInterruptsEnabled = 0; |
dflet | 0:305844973572 | 157 | } |
dflet | 0:305844973572 | 158 | |
dflet | 0:305844973572 | 159 | char *SendFirmwarePatch(unsigned long *Length) { |
dflet | 0:305844973572 | 160 | *Length = 0; |
dflet | 0:305844973572 | 161 | return NULL; |
dflet | 0:305844973572 | 162 | } |
dflet | 0:305844973572 | 163 | |
dflet | 0:305844973572 | 164 | |
dflet | 0:305844973572 | 165 | |
dflet | 0:305844973572 | 166 | char *SendDriverPatch(unsigned long *Length) { |
dflet | 0:305844973572 | 167 | *Length = 0; |
dflet | 0:305844973572 | 168 | return NULL; |
dflet | 0:305844973572 | 169 | } |
dflet | 0:305844973572 | 170 | |
dflet | 0:305844973572 | 171 | |
dflet | 0:305844973572 | 172 | char *SendBootloaderPatch(unsigned long *Length) { |
dflet | 0:305844973572 | 173 | *Length = 0; |
dflet | 0:305844973572 | 174 | return NULL; |
dflet | 0:305844973572 | 175 | } |
dflet | 0:305844973572 | 176 | |
dflet | 0:305844973572 | 177 |