Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BaseDAP SWD USBDAP USBLocalFileSystem mbed DA14580 SWSPI W25X40BV
USB memory + Writer for DA14580 BLE chip + CMSIS-DAP debugger + USB-UART functions in one chip
One button input loads your application into DA14580 or DA14580 included BLE modules
Quote:
Current compatible hardware description can be found at https://github.com/K4zuki/da14580/releases/tag/MurataBLEr04
DA14580/DA14580.cpp@2:228291df190e, 2015-08-19 (annotated)
- Committer:
- k4zuki
- Date:
- Wed Aug 19 13:23:10 2015 +0000
- Revision:
- 2:228291df190e
11U35 CMSIS-DAP; add DA14580.h/.cpp
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| k4zuki | 2:228291df190e | 1 | #include "mbed.h" |
| k4zuki | 2:228291df190e | 2 | #include "DA14580.h" |
| k4zuki | 2:228291df190e | 3 | |
| k4zuki | 2:228291df190e | 4 | /* |
| k4zuki | 2:228291df190e | 5 | |
| k4zuki | 2:228291df190e | 6 | DigitalOut myled(LED1); |
| k4zuki | 2:228291df190e | 7 | |
| k4zuki | 2:228291df190e | 8 | Serial pc(USBTX,USBRX); |
| k4zuki | 2:228291df190e | 9 | Serial ble(p28,p27); |
| k4zuki | 2:228291df190e | 10 | |
| k4zuki | 2:228291df190e | 11 | LocalFileSystem local( "local" ); |
| k4zuki | 2:228291df190e | 12 | |
| k4zuki | 2:228291df190e | 13 | #define SOURCE_FILE "/local/_loader" |
| k4zuki | 2:228291df190e | 14 | #define TARGET_FILE "/local/_bin" |
| k4zuki | 2:228291df190e | 15 | |
| k4zuki | 2:228291df190e | 16 | int file_size( FILE *fp ); |
| k4zuki | 2:228291df190e | 17 | enum XMODEM_CONST{ |
| k4zuki | 2:228291df190e | 18 | SOH = (0x01), |
| k4zuki | 2:228291df190e | 19 | STX = (0x02), |
| k4zuki | 2:228291df190e | 20 | EOT = (0x04), |
| k4zuki | 2:228291df190e | 21 | ACK = (0x06), |
| k4zuki | 2:228291df190e | 22 | DLE = (0x10), |
| k4zuki | 2:228291df190e | 23 | NAK = (0x15), |
| k4zuki | 2:228291df190e | 24 | CAN = (0x18), |
| k4zuki | 2:228291df190e | 25 | }; |
| k4zuki | 2:228291df190e | 26 | */ |
| k4zuki | 2:228291df190e | 27 | DA14580::DA14580( PinName TX, PinName RX, PinName RESET ) : _ble(TX,RX), _reset(RESET) |
| k4zuki | 2:228291df190e | 28 | { |
| k4zuki | 2:228291df190e | 29 | init(); |
| k4zuki | 2:228291df190e | 30 | ; |
| k4zuki | 2:228291df190e | 31 | } |
| k4zuki | 2:228291df190e | 32 | |
| k4zuki | 2:228291df190e | 33 | DA14580::DA14580( Serial &ble, PinName RESET ) : _ble(ble), _reset(RESET) |
| k4zuki | 2:228291df190e | 34 | { |
| k4zuki | 2:228291df190e | 35 | init(); |
| k4zuki | 2:228291df190e | 36 | ; |
| k4zuki | 2:228291df190e | 37 | } |
| k4zuki | 2:228291df190e | 38 | |
| k4zuki | 2:228291df190e | 39 | void DA14580::init(){ |
| k4zuki | 2:228291df190e | 40 | |
| k4zuki | 2:228291df190e | 41 | _ble.baud(57600); |
| k4zuki | 2:228291df190e | 42 | _crc = 0x00; |
| k4zuki | 2:228291df190e | 43 | _recieve = 0; |
| k4zuki | 2:228291df190e | 44 | _read = 0; |
| k4zuki | 2:228291df190e | 45 | _filesize = 0; |
| k4zuki | 2:228291df190e | 46 | _reset = 0; |
| k4zuki | 2:228291df190e | 47 | _timeout = 100; |
| k4zuki | 2:228291df190e | 48 | _status = SUCCESS; |
| k4zuki | 2:228291df190e | 49 | } |
| k4zuki | 2:228291df190e | 50 | |
| k4zuki | 2:228291df190e | 51 | int DA14580::load(){ |
| k4zuki | 2:228291df190e | 52 | |
| k4zuki | 2:228291df190e | 53 | _status = SUCCESS; |
| k4zuki | 2:228291df190e | 54 | |
| k4zuki | 2:228291df190e | 55 | _fp = fopen( LOADER_FILE, "rb" ); |
| k4zuki | 2:228291df190e | 56 | if (_fp) { |
| k4zuki | 2:228291df190e | 57 | _filesize = file_size(_fp); |
| k4zuki | 2:228291df190e | 58 | // pc.printf("0x%04X\n\r",_filesize); |
| k4zuki | 2:228291df190e | 59 | while((_timeout--) >0){ |
| k4zuki | 2:228291df190e | 60 | if( _ble.readable() ){ |
| k4zuki | 2:228291df190e | 61 | _recieve = _ble.getc(); |
| k4zuki | 2:228291df190e | 62 | if(_recieve == STX) { |
| k4zuki | 2:228291df190e | 63 | _ble.putc(SOH); |
| k4zuki | 2:228291df190e | 64 | // pc.putc('!'); |
| k4zuki | 2:228291df190e | 65 | break; |
| k4zuki | 2:228291df190e | 66 | } |
| k4zuki | 2:228291df190e | 67 | } |
| k4zuki | 2:228291df190e | 68 | } |
| k4zuki | 2:228291df190e | 69 | if(_timeout <= 0){ |
| k4zuki | 2:228291df190e | 70 | _status = E_TIMEOUT_STX; |
| k4zuki | 2:228291df190e | 71 | }else{ |
| k4zuki | 2:228291df190e | 72 | _timeout = 100; |
| k4zuki | 2:228291df190e | 73 | _ble.putc(_filesize & 0xff); |
| k4zuki | 2:228291df190e | 74 | _ble.putc( (_filesize >> 8) & 0xff); |
| k4zuki | 2:228291df190e | 75 | while((_timeout--) >0){ |
| k4zuki | 2:228291df190e | 76 | if( _ble.readable() ){ |
| k4zuki | 2:228291df190e | 77 | _recieve = _ble.getc(); |
| k4zuki | 2:228291df190e | 78 | if(_recieve == ACK) { |
| k4zuki | 2:228291df190e | 79 | // pc.printf("ok!\n\r"); |
| k4zuki | 2:228291df190e | 80 | break; |
| k4zuki | 2:228291df190e | 81 | } |
| k4zuki | 2:228291df190e | 82 | } |
| k4zuki | 2:228291df190e | 83 | } |
| k4zuki | 2:228291df190e | 84 | if(_timeout <= 0){ |
| k4zuki | 2:228291df190e | 85 | _status = E_ACK_NOT_RETURNED; |
| k4zuki | 2:228291df190e | 86 | }else{ |
| k4zuki | 2:228291df190e | 87 | _timeout = 100; |
| k4zuki | 2:228291df190e | 88 | for(int i = 0; i < _filesize; i++){ |
| k4zuki | 2:228291df190e | 89 | _read = getc(_fp); |
| k4zuki | 2:228291df190e | 90 | _ble.putc(_read); |
| k4zuki | 2:228291df190e | 91 | _crc = _crc ^ _read; |
| k4zuki | 2:228291df190e | 92 | if((i % 16) == 0){ |
| k4zuki | 2:228291df190e | 93 | // pc.printf("\n\r"); |
| k4zuki | 2:228291df190e | 94 | } |
| k4zuki | 2:228291df190e | 95 | // pc.printf("%02X ",_read); |
| k4zuki | 2:228291df190e | 96 | } |
| k4zuki | 2:228291df190e | 97 | // pc.printf("\n\r0x%02X ",_crc); |
| k4zuki | 2:228291df190e | 98 | while((_timeout--) >0){ |
| k4zuki | 2:228291df190e | 99 | if( _ble.readable() ){ |
| k4zuki | 2:228291df190e | 100 | _recieve = _ble.getc(); |
| k4zuki | 2:228291df190e | 101 | if(_recieve == _crc) { |
| k4zuki | 2:228291df190e | 102 | _ble.putc(ACK); |
| k4zuki | 2:228291df190e | 103 | // pc.printf("-=-=DONE=-=-\n\r"); |
| k4zuki | 2:228291df190e | 104 | break; |
| k4zuki | 2:228291df190e | 105 | } |
| k4zuki | 2:228291df190e | 106 | } |
| k4zuki | 2:228291df190e | 107 | } |
| k4zuki | 2:228291df190e | 108 | if(_timeout <= 0){ |
| k4zuki | 2:228291df190e | 109 | _status = E_ACK_NOT_RETURNED; |
| k4zuki | 2:228291df190e | 110 | } |
| k4zuki | 2:228291df190e | 111 | } |
| k4zuki | 2:228291df190e | 112 | } |
| k4zuki | 2:228291df190e | 113 | fclose(_fp); |
| k4zuki | 2:228291df190e | 114 | #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler |
| k4zuki | 2:228291df190e | 115 | free(_fp); |
| k4zuki | 2:228291df190e | 116 | #endif |
| k4zuki | 2:228291df190e | 117 | }else{ |
| k4zuki | 2:228291df190e | 118 | _status = E_FILE_NOT_FOUND; |
| k4zuki | 2:228291df190e | 119 | } |
| k4zuki | 2:228291df190e | 120 | return _status; |
| k4zuki | 2:228291df190e | 121 | |
| k4zuki | 2:228291df190e | 122 | |
| k4zuki | 2:228291df190e | 123 | } |
| k4zuki | 2:228291df190e | 124 | |
| k4zuki | 2:228291df190e | 125 | int DA14580::file_size( FILE *fp ) |
| k4zuki | 2:228291df190e | 126 | { |
| k4zuki | 2:228291df190e | 127 | int size; |
| k4zuki | 2:228291df190e | 128 | |
| k4zuki | 2:228291df190e | 129 | fseek( fp, 0, SEEK_END ); // seek to end of file |
| k4zuki | 2:228291df190e | 130 | size = ftell( fp ); // get current file pointer |
| k4zuki | 2:228291df190e | 131 | fseek( fp, 0, SEEK_SET ); // seek back to beginning of file |
| k4zuki | 2:228291df190e | 132 | |
| k4zuki | 2:228291df190e | 133 | return size; |
| k4zuki | 2:228291df190e | 134 | } |
| k4zuki | 2:228291df190e | 135 | |
| k4zuki | 2:228291df190e | 136 | /* |
| k4zuki | 2:228291df190e | 137 | int main() |
| k4zuki | 2:228291df190e | 138 | { |
| k4zuki | 2:228291df190e | 139 | uint8_t recieve; |
| k4zuki | 2:228291df190e | 140 | uint8_t read; |
| k4zuki | 2:228291df190e | 141 | int filesize=0; |
| k4zuki | 2:228291df190e | 142 | FILE* fp; |
| k4zuki | 2:228291df190e | 143 | ble.baud(57600); |
| k4zuki | 2:228291df190e | 144 | int crc=0x00; |
| k4zuki | 2:228291df190e | 145 | |
| k4zuki | 2:228291df190e | 146 | fp = fopen( SOURCE_FILE, "rb" ); |
| k4zuki | 2:228291df190e | 147 | if (fp) { |
| k4zuki | 2:228291df190e | 148 | filesize=file_size(fp); |
| k4zuki | 2:228291df190e | 149 | pc.printf("0x%04X\n\r",filesize); |
| k4zuki | 2:228291df190e | 150 | } |
| k4zuki | 2:228291df190e | 151 | |
| k4zuki | 2:228291df190e | 152 | while(1) { |
| k4zuki | 2:228291df190e | 153 | recieve=ble.getc(); |
| k4zuki | 2:228291df190e | 154 | if(recieve == STX) { |
| k4zuki | 2:228291df190e | 155 | ble.putc(SOH); |
| k4zuki | 2:228291df190e | 156 | pc.putc('!'); |
| k4zuki | 2:228291df190e | 157 | break; |
| k4zuki | 2:228291df190e | 158 | } |
| k4zuki | 2:228291df190e | 159 | } |
| k4zuki | 2:228291df190e | 160 | ble.putc(filesize&0xff); |
| k4zuki | 2:228291df190e | 161 | ble.putc( (filesize>>8)&0xff); |
| k4zuki | 2:228291df190e | 162 | while(1) { |
| k4zuki | 2:228291df190e | 163 | recieve=ble.getc(); |
| k4zuki | 2:228291df190e | 164 | if(recieve == ACK) { |
| k4zuki | 2:228291df190e | 165 | pc.printf("ok!\n\r"); |
| k4zuki | 2:228291df190e | 166 | // ble.putc(0x01); |
| k4zuki | 2:228291df190e | 167 | break; |
| k4zuki | 2:228291df190e | 168 | } |
| k4zuki | 2:228291df190e | 169 | } |
| k4zuki | 2:228291df190e | 170 | for(int i=0;i<filesize;i++){ |
| k4zuki | 2:228291df190e | 171 | read=getc(fp); |
| k4zuki | 2:228291df190e | 172 | ble.putc(read); |
| k4zuki | 2:228291df190e | 173 | crc=crc^read; |
| k4zuki | 2:228291df190e | 174 | if((i%16)==0){ |
| k4zuki | 2:228291df190e | 175 | pc.printf("\n\r"); |
| k4zuki | 2:228291df190e | 176 | } |
| k4zuki | 2:228291df190e | 177 | pc.printf("%02X ",read); |
| k4zuki | 2:228291df190e | 178 | } |
| k4zuki | 2:228291df190e | 179 | pc.printf("\n\r0x%02X ",crc); |
| k4zuki | 2:228291df190e | 180 | while(1) { |
| k4zuki | 2:228291df190e | 181 | recieve=ble.getc(); |
| k4zuki | 2:228291df190e | 182 | if(recieve == crc) { |
| k4zuki | 2:228291df190e | 183 | ble.putc(ACK); |
| k4zuki | 2:228291df190e | 184 | pc.printf("-=-=DONE=-=-\n\r"); |
| k4zuki | 2:228291df190e | 185 | break; |
| k4zuki | 2:228291df190e | 186 | } |
| k4zuki | 2:228291df190e | 187 | } |
| k4zuki | 2:228291df190e | 188 | fclose(fp); |
| k4zuki | 2:228291df190e | 189 | myled = 1; |
| k4zuki | 2:228291df190e | 190 | while(1) { |
| k4zuki | 2:228291df190e | 191 | recieve=ble.getc(); |
| k4zuki | 2:228291df190e | 192 | pc.putc(recieve); |
| k4zuki | 2:228291df190e | 193 | wait_ms(20); |
| k4zuki | 2:228291df190e | 194 | } |
| k4zuki | 2:228291df190e | 195 | } |
| k4zuki | 2:228291df190e | 196 | |
| k4zuki | 2:228291df190e | 197 | */ |