CC3000 test App

Dependencies:   CC3000HostDriver mbed

Committer:
dflet
Date:
Sun Aug 25 16:30:45 2013 +0000
Revision:
1:ee5703f58be3
Parent:
0:305844973572
Child:
2:17c37c0b0534
Check for CC3000 IRQ low, due to blocking procedures. IRQ can change state and not be serviced. CC3000Core.cpp function WlanInterruptEnable.

Who changed what in which revision?

UserRevisionLine numberNew 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 1:ee5703f58be3 146 //This check is required due to IRQ being turned off during blocking proceedures.
dflet 1:ee5703f58be3 147 //Check if CC3000 irq is low, and service.
dflet 1:ee5703f58be3 148 val = ReadWlanInterruptPin();
dflet 1:ee5703f58be3 149 if (!val)
dflet 1:ee5703f58be3 150 {
dflet 1:ee5703f58be3 151 IntSpi();
dflet 1:ee5703f58be3 152 }
dflet 0:305844973572 153 //__enable_irq(); //Enable Interrupts
dflet 0:305844973572 154 //SPIInterruptsEnabled = 1;
dflet 1:ee5703f58be3 155 }
dflet 0:305844973572 156
dflet 0:305844973572 157
dflet 0:305844973572 158 void WlanInterruptDisable(void) {
dflet 0:305844973572 159
dflet 0:305844973572 160 irq.fall(NULL);
dflet 0:305844973572 161
dflet 0:305844973572 162 //__disable_irq(); //Disable Interrupts
dflet 0:305844973572 163 //SPIInterruptsEnabled = 0;
dflet 0:305844973572 164 }
dflet 0:305844973572 165
dflet 0:305844973572 166 char *SendFirmwarePatch(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
dflet 0:305844973572 173 char *SendDriverPatch(unsigned long *Length) {
dflet 0:305844973572 174 *Length = 0;
dflet 0:305844973572 175 return NULL;
dflet 0:305844973572 176 }
dflet 0:305844973572 177
dflet 0:305844973572 178
dflet 0:305844973572 179 char *SendBootloaderPatch(unsigned long *Length) {
dflet 0:305844973572 180 *Length = 0;
dflet 0:305844973572 181 return NULL;
dflet 0:305844973572 182 }
dflet 0:305844973572 183
dflet 0:305844973572 184