📄 mca25.c
字号:
mca25_puts_progmem("\r\r\n+CMUX: (0),(0),(1-7),(31),(10),(3),(30),(10),(1-7)\r\n"); state = 4; } break; case 4: //wait for mux enable request if (string_compare_progmem_plen("AT+CMUX=0,0,7,31", mca25_buffer)){ #if MCA25_DEBUG softuart_puts_progmem("at done, "); #endif mca25_send_ok(); state = 10; } break; case 10: // wait for mux ch0 request: // [F9 03 3F 01 1C F9] //if (string_compare_progmem_plen("\xF9\x03\x3F\x01\x1C\xF9", mca25_buffer)){ if ((mca25_mux_buffer[0] == 0x03) && (mca25_mux_buffer[2] == 0x01)){ // send mux ch0 ack/open packet: // [F9 03 73 01 D7 F9] mca25_puts_progmem("\xF9\x03\x73\x01\xD7\xF9"); state = 11; } break; case 11: // wait for mux ch3 request: // [F9 23 3F 01 C9 F9] //if (string_compare_progmem_plen("\xF9\x23\x3F\x01\xC9\xF9", mca25_buffer)){ if ((mca25_mux_buffer[0] == 0x23) && (mca25_mux_buffer[2] == 0x01)){ // send mux ch3 ack/open packet: // [F9 23 73 01 02 F9] mca25_puts_progmem("\xF9\x23\x73\x01\x02\xF9"); state = 12; } break; case 12: // wait for config mux ch0 request: // [F9 03 EF 09 E3 05 23 8D FB F9] //if (string_compare_progmem_plen("\xF9\x03\xEF\x09\xE3\x05\x23\x8D\xFB\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\xE3\x05\x23\x8D", mca25_buffer)){ // send mux ch0 config ack/open packet: // [F9 01 EF 0B E3 07 23 0C 01 79 F9] mca25_puts_progmem("\xF9\x01\xEF\x0B\xE3\x07\x23\x0C\x01\x79\xF9"); state = 13; } break; case 13: // wait for config mux ch3 request: // [F9 03 EF 09 E1 07 23 0C 01 FB F9] //if (string_compare_progmem_plen("\xF9\x03\xEF\x09\xE1\x07\x23\x0C\x01\xFB\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\xE1\x07\x23\x0C\x01", mca25_buffer)){ // send mux ch3 config ack/open packet: // [F9 01 EF 09 E1 05 23 8D 9A F9] mca25_puts_progmem("\xF9\x01\xEF\x09\xE1\x05\x23\x8D\x9A\xF9"); state = 14; } break; case 14: // wait for AT*EACS.17.1.r: // [F9 23 EF 1B 41 54 2A 45 41 43 53 3D 31 37 2C 31 0D D1 F9] //if (memcmp(buf,"\xF9\x23\xEF\x1BAT*EACS=17,1\r\xD1\xF9",19) == 0){ //if (string_compare_progmem_plen("\xF9\x23\xEF\x1B\x41\x54\x2A\x45\x41\x43\x53\x3D\x31\x37\x2C\x31\x0D\xD1\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\x41\x54\x2A\x45\x41\x43\x53\x3D\x31\x37\x2C\x31\x0D", mca25_buffer)){ // send mux "\r\nOK\r\n" packet: // [F9 21 EF 0D 0D 0A 4F 4B 0D 0A 48 F9] mca25_puts_progmem("\xF9\x21\xEF\x0D\x0D\x0A\x4F\x4B\x0D\x0A\x48\xF9"); state = 15; } break; case 15: // wait for AT+CSCC=1,199\r5 peripheral AUTH req: // [F9 23 EF 1D 41 54 2B 43 53 43 43 3D 31 2C 31 39 39 0D 35 F9] //if (string_compare_progmem_plen("\xF9\x23\xEF\x1D\x41\x54\x2B\x43\x53\x43\x43\x3D\x31\x2C\x31\x39\x39\x0D\x35\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\x41\x54\x2B\x43\x53\x43\x43\x3D\x31\x2C\x31\x39\x39\x0D", mca25_buffer)){ // send response token: //DONT// [F9 21 EF 1D 41 54 2B 43 53 43 43 3D 31 2C 31 39 39 0D 54 F9] // [F9 21 EF 1B 0D 0A 2B 43 53 43 43 3A 20 45 33 0D 0A B0 F9 ] //printf("\xF9\x21\xEF\x1D\x41\x54\x2B\x43\x53\x43" // "\x43\x3D\x31\x2C\x31\x39\x39\x0D\x54\xF9"); mca25_puts_progmem("\xF9\x21\xEF\x1B\x0D\x0A\x2B\x43\x53\x43" "\x43\x3A\x20\x45\x33\x0D\x0A\xB0\xF9"); //append ok: mca25_puts_progmem("\xF9\x21\xEF\x0D\x0D\x0A\x4F\x4B\x0D\x0A\x48\xF9"); state = 16; } break; case 16: // wait for AT+CSCC=2,199.B9\r AUTH2 req: // AT+CSCC.2.199.B9.r| // [F9 23 EF 23 41 54 2B 43 53 43 43 3D 32 2C 31 39 39 2C 42 39 0D FB F9] //if (string_compare_progmem_plen("\xF9\x23\xEF\x23\x41\x54\x2B\x43\x53\x43\x43\x3D\x32\x2C\x31\x39\x39\x2C\x42\x39\x0D\xFB\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\x41\x54\x2B\x43\x53\x43\x43\x3D\x32\x2C\x31\x39\x39\x2C\x42\x39\x0D", mca25_buffer)){ // send response token: (OK) // [F9 21 EF 0D 0D 0A 4F 4B 0D 0A 48 F9] mca25_puts_progmem("\xF9\x21\xEF\x0D\x0D\x0A\x4F\x4B\x0D\x0A\x48\xF9"); // now request data mux channel (ch1): // [F9 81 3F 01 AB F9] mca25_puts_progmem("\xF9\x81\x3F\x01\xAB\xF9"); state = 17; } break; case 17: // wait for mux ch1 ack: // [F9 81 73 01 60 F9] //if (string_compare_progmem_plen("\xF9\x81\x73\x01\x60\xF9", mca25_buffer)){ if ((mca25_mux_buffer[0] == 0x81) && (mca25_mux_buffer[2] == 0x01)){ // channel1 is now open! state = 18; } break; case 18: // wait for ch1 mux config: // [F9 03 EF 09 E3 05 83 8D FB F9] //if (string_compare_progmem_plen("\xF9\x03\xEF\x09\xE3\x05\x83\x8D\xFB\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\xE3\x05\x83\x8D", mca25_buffer)){ // send config response: // [F9 01 EF 09 E1 05 83 8D 9A F9] mca25_puts_progmem("\xF9\x01\xEF\x09\xE1\x05\x83\x8D\x9A\xF9"); // now configure cam mode: // [ F9 81 EF 37 80 00 1A 10 00 01 00 46 00 13 E3 3D // 95 45 83 74 4A D7 9E C5 C1 6B E3 1E DE 8E 61 82 F9 ] // F9 81 EF 37 = mux header // 80 00 1A 10 00 = ??? // 01 00 = (256-6)Byte data, then wait for ACK // 46 00 13 E3 3D 95 45 83 74 4A D7 9E C5 C1 6B E3 1E DE 8E 61 ??? mca25_puts_progmem("\xF9\x81\xEF\x37\x80\x00\x1A\x10\x00"); //mca25_puts_progmem("\x02\x00");//buffsize 512 byte mca25_uart_putc(hi8(NIC_BUFFERSIZE-TCP_POS_TXDATA+6)); mca25_uart_putc(lo8(NIC_BUFFERSIZE-TCP_POS_TXDATA+6)); //"\x02\x28");//buffsize 546 data byte (but we have 6 dont care bytes) -> 546+6 = 552 mca25_puts_progmem("\x46\x00\x13\xE3\x3D\x95\x45\x83\x74\x4A\xD7\x9E"); mca25_puts_progmem("\xC5\xC1\x6B\xE3\x1E\xDE\x8E\x61\x82\xF9"); mca25_puts_progmem("\xF9\x21\xEF\x0D\x0D\x0A\x4F\x4B\x0D\x0A\x48\xF9"); state = 19; } break; case 19: // cam should now accept our settings: // [F9 83 EF 3F A0 00 1F 10 00 20 00 CB 00 00 00 01 4A 00 // 13 E3 3D 95 45 83 74 4A D7 9E C5 C1 6B E3 1E DE 8E ED F9 //if (string_compare_progmem_plen("\xF9\x83\xEF\x3F\xA0\x00\x1F\x10\x00\x20\x00\xCB\x00\x00\x00\x01\x4A\x00\x13\xE3\x3D\x95\x45\x83\x74\x4A\xD7\x9E\xC5\xC1\x6B\xE3\x1E\xDE\x8E\xED\xF9", mca25_buffer)){ if (string_compare_progmem_plen("\xA0\x00\x1F\x10\x00\x20\x00\xCB\x00\x00\x00\x01\x4A\x00\x13\xE3\x3D\x95\x45\x83\x74\x4A\xD7\x9E\xC5\xC1\x6B\xE3\x1E\xDE\x8E", mca25_buffer)){ state = 100; //-> exit init loop. #if MCA25_DEBUG softuart_puts_progmem("mux. "); #endif } break; default: break; } } #if MCA25_DEBUG softuart_puts_progmem("ready"); //finished! CAM found & ready!"); softuart_putnewline(); #endif //cam is initialised: mca25_ready = 1; return 0;}//send okvoid mca25_send_ok(void){ mca25_puts_progmem("\r\r\nOK\r\n");}//read at commandunsigned char mca25_read_at_command(unsigned char *buffer){ unsigned int cnt; //set timeout to t+8 seconds: clock_timeout_timer = 8; #if MCA25_DEBUG //softuart_puts_progmem("CAM : rx ["); #endif for(cnt=0;cnt<MCA25_COMM_BUFFER_LEN;cnt++){ if (clock_timeout_timer == 0) return 0; //wait for data in while (!(UCSRA & (1<<RXC))){ if (clock_timeout_timer == 0) return 0; } buffer[cnt] = UDR; if (buffer[cnt] == '\r' || buffer[cnt] == '\n'){ buffer[cnt] = '\0'; break; //we have finished read. } } #if MCA25_DEBUG /*for(cnt=0;cnt<MCA25_COMM_BUFFER_LEN;cnt++){ if (buffer[cnt] == 0) break; softuart_putc(buffer[cnt]); } softuart_puts_progmem("]\r\n");*/ #endif return 1;}//read mux packetunsigned char mca25_read_mux_packet(unsigned char *buffer, unsigned char skipcount){ unsigned char data; unsigned char state = 0; unsigned char len = 0; unsigned char crc = 0; unsigned char bufpos = 0; unsigned char muxbufpos = 0; //set timeout to t+3 seconds: clock_timeout_timer = 3; while (clock_timeout_timer > 0){ //wait for incoming data: (abort if timeout!) while (!(UCSRA & (1<<RXC))){ if (clock_timeout_timer == 0){ #if MCA25_DEBUG softuart_put_uint8(state); softuart_put_uint8(len); #endif return 0; } } data = UDR; if ((state == 4) || (state ==5 )){ if (skipcount == 0){ buffer[bufpos++] = data; }else{ skipcount--; } } LED_STATUS_ON(); switch (state){ case 0: // waiting for start flag if (data == 0xF9){ bufpos = 0; state = 1; } break; case 1: // address if (data == 0xF9){ bufpos = 0; }else{ muxbufpos = 0; mca25_mux_buffer[0] = data; state = 2; } break; case 2: // frame type if (data != 0xF9){ state = 3; mca25_mux_buffer[1] = data; muxbufpos = 2; }else{ //strange ... happens sometime! state = 1; bufpos = 0; } break; case 3: // frame length len = (data >> 1); //limt length if (len>31) len = 31; mca25_mux_buffer[muxbufpos++] = data; if (len > 0) state = 4; else state = 5; break; case 4: // package data if (muxbufpos<6) mca25_mux_buffer[muxbufpos++] = data; len--; if (len == 0) state = 5; break; case 5: // checksum crc = 0xFF; crc = crc8_calc_byte_rev0x07(crc, mca25_mux_buffer[0]); crc = crc8_calc_byte_rev0x07(crc, mca25_mux_buffer[1]); crc = crc8_calc_byte_rev0x07(crc, mca25_mux_buffer[2]); crc = 0xFF - crc; if (crc != data){ // -> bad crc ! // special handling of the "buggy" config message // \xF9\x03\xEF\x09\xE1\x07\x23\x0C\x01\xFB\xF9 if ((buffer[0] == 0xE1) && (buffer[1] == 0x07) && (buffer[3] == 0x0C)){ //softuart_puts_progmem("CAM : buggy cfg detected"); //read extra char for buggy config message: while (!(UCSRA & (1<<RXC))){ if (clock_timeout_timer == 0) return 0; } data = UDR; //softuart_puts_progmem("skipped extra data.\r\n"); state = 6; }else{ #if MCA25_DEBUG softuart_puts_progmem("CAM : bad crc "); softuart_put_uint8(crc); softuart_putc(':'); softuart_put_uint8(data); softuart_putnewline(); #endif state = 0; } }else{ state = 6; } break; case 6: // flag if (data != 0xF9){ #if MCA25_DEBUG softuart_puts_progmem("CAM : bad packet ?! "); softuart_put_uint8(data); softuart_putnewline(); #endif state = 0; }else{ LED_STATUS_OFF(); return 1; } break; default: break; } } LED_STATUS_OFF(); return 0;}//put progmem data with given length,//see mca25.h for the mca25_puts_progmem(s) macro !!void mca25_puts_progmem2(PGM_P pointer, unsigned int len){ //softuart_put_uint16(len); while (len--){ if (pgm_read_byte(pointer) == 0xF9) _delay_ms(1); mca25_uart_putc(pgm_read_byte(pointer++)); }}//initialise 460kbaudvoid mca25_uart_init_460800(void){ _delay_ms(2); UBRRH=(F_CPU / (460800L * 16L) - 1)>>8; UBRRL=(F_CPU / (460800L * 16L) - 1)&0xFF;}//initialise uartvoid mca25_uart_init_9600(void){ UBRRH = (F_CPU / (9600 * 16L) - 1)>>8; UBRRL = (F_CPU / (9600 * 16L) - 1)&0xFF; //activate uart TX+RX UCSRB |= (1<<TXEN)|(1<<RXEN); //async 8N1 UCSRC |= (1<<URSEL)|(3<<UCSZ0);}//initialise uartvoid mca25_uart_init_19200(void){ UBRRH = (F_CPU / (19200 * 16L) - 1)>>8; UBRRL = (F_CPU / (19200 * 16L) - 1)&0xFF;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -