#include "utils.h"
#include "drivers.h"
#include "stdio.h"
#include "wifi.h"
#define baud_rate 9600
#define cpu_fre 11059200
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
//sbit SPI_MOSI = P1^0;
//sbit SPI_MISO = P1^1;
//sbit SPI_SCK = P1^2;
//sbit SPI_NSS = P1^3;
//sbit INT = P3^2;
//u8 buf[10];
struct system_config
{
// WIFI
u8 wifi_mode;
u8 wifi_ssid[32];
u8 wifi_wepkey[16];
u8 wifi_wepkeylen;
// TCP/IP
u8 ip_addr[16];
u8 net_mask[16];
u16 port;
u8 connect_mode;
};
struct system_config s;
void portIni(void)
{
/*
PORTB = MSK_ENJ; //high
DDRB = MSK_ENJ; //port out
PORTB = MSK_ENJ; //high
SPCR = (1 << SPE) | (1 << MSTR);
SPSR = (1 << SPI2X); //1/2 MCK
*/
spi_request_bus();
// spi_set_master();
spi_enable_interrupt(FALSE);// disable interrupt
spi_set_baudrate(2000); // baudrate
gpio_enable_input(1UL<<15);
}
u8_t get_wifi_int_status(void)
{
u32_t dat;
dat=gpio_get_data();
if(dat&(1UL<<15))
return 1;
else
return 0;
}
void wait(u8 sec)
{
int i;
for(i=0;i<sec*100;i++);
}
void spi_send_data(u8 *buf,u16_t len)
{
u16_t i;
spi_set_output_mode(0, TRUE, FALSE, TRUE);
for(i=0;i<len;i++)
{
spi_write_data(buf[i]);
while (!(spi_get_status() & (1<<0)));
}
spi_set_output_mode(1, TRUE, FALSE, TRUE);
}
void spi_recv_data(u16_t len,u8_t *revc_buf)
{
// spi_set_output_mode(0, TRUE, FALSE, TRUE);
spi_set_input_count(1);
spi_set_input_mode(0, TRUE, FALSE, TRUE); while (!(spi_get_status() & (1<<1)));
spi_read_data();
while(len--)
{
spi_set_input_count(1);
spi_set_input_mode(0, TRUE, FALSE, TRUE); while (!(spi_get_status() & (1<<1)));
*revc_buf++=spi_read_data();
}
// spi_set_input_mode(1, TRUE, FALSE, TRUE);
// spi_set_output_mode(1, TRUE, FALSE, TRUE);
}
void emsp_cmd_get_config()
{
u8 buf[10] = {0x02,0x00,0x0A,0x00,0x00,0x00,0xF3,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
u16_t cal_sum(void *datal,u16_t len)
{
u32_t chksum=0;
u16_t *p=datal;
while(len>1)
{
chksum+=*p++;
len-=2;
}
if(len)
{
chksum+=*(u8_t *)p;
}
chksum=(chksum>>16)+(chksum&0xffff);
chksum+=(chksum>>16);
return ~chksum;
}
void emsp_cmd_set_config(void)
{
u16_t i;
u8_t buf[95] = {0};
buf[0]= 0x03;
buf[1]= 0x00;
buf[2]= 0x5f;
buf[3]= 0x00;
buf[4]= 0x00;
buf[5]= 0x00;
buf[6]= 0x9d;
buf[7]= 0xff;
buf[8]= 0x1;
buf[9]= 'l';
buf[10]='a';
buf[11]='n';
buf[58] = 192;
buf[59] = 168;
buf[60] = 0;
buf[61] = 66;
buf[74] = 255;
buf[75] = 255;
buf[76] = 255;
buf[77] = 0;
buf[90] = 0x06;
buf[91] = 0x08;
buf[92] = 0x0;
i=cal_sum(&buf[8],85);
buf[93] = i>>8 ;
buf[94] = i&0xff;
spi_send_data(buf,95);
}
void emsp_cmd_scan_ap()
{
u8 buf[10] = {0x04,0x00,0x0A,0x00,0x00,0x00,0xF1,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
void emsp_cmd_start()
{
u8 buf[10] = {0x05,0x00,0x0A,0x00,0x00,0x00,0xF0,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
void emsp_cmd_send_data()
{
u8 buf[19] = {0x06,0x00,0x13,0x00,0x00,0x00,0xE6,0xFF,0x74,0x65,0x73,0x74,0x20,0x64,0x61,0x74,0x61,0x35,0x4D};
spi_send_data(buf,19);
}
void emsp_cmd_recv_data()
{
u8 buf[10] = {0x07,0x00,0x0A,0x00,0x00,0x00,0xEE,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
void emsp_cmd_get_status()
{
u8 buf[10] = {0x08,0x00,0x0A,0x00,0x00,0x00,0xED,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
void emsp_cmd_get_ver(void)
{
u8 buf[10] = {0x09,0x00,0x0A,0x00,0x00,0x00,0xEC,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
void emsp_cmd_reset(void)
{
u8 buf[10] = {0x01,0x00,0x0A,0x00,0x00,0x00,0xF4,0xFF,0xFF,0xFF};
spi_send_data(buf,10);
}
void init_wifi()
{
emsp_cmd_get_ver();
emsp_cmd_get_config();
emsp_cmd_set_config();
emsp_cmd_start();
emsp_cmd_get_status();
emsp_cmd_send_data();
}
u8_t reset_wifi(void)
{
u8_t i;
u8_t revbuf[10]={0};
while(get_wifi_int_status());
emsp_cmd_reset();
while(get_wifi_int_status());
spi_recv_data(10,revbuf);
for(i=0;i<10;i++)
{
printf("revbuf[%u]=%x\n",(u16_t)i,(u16_t)revbuf[i]);
}
if((revbuf[4]==0x01)&&(revbuf[0]==0x01))
return 1;
else
return 0;
}
u8_t test_wifi(void)
{
u8_t i;
u8_t revbuf[14]={0};
// while(get_wifi_int_status());
emsp_cmd_get_ver();
wait(12);
printf("hi");
//while(get_wifi_int_status());
spi_recv_data(14,revbuf);
for(i=0;i<14;i++)
{
printf("revbuf[%u]=%x\n",(u16_t)i,(u16_t)revbuf[i]);
}
if((revbuf[12]==0xfd)&&(revbuf[6]==0xe7))
return 1;
else
return 0;
}
u8_t test_set_config(void)
{
u8_t i;
u8_t revbuf[95]={0};
while(get_wifi_int_status());
emsp_cmd_set_config();
while(get_wifi_int_status());
spi_recv_data(95,revbuf);
for(i=0;i<95;i++)
{
printf("revbuf[%u]=%u\n",(u16_t)i,(u16_t)revbuf[i]);
}
if((revbuf[5]!=0xff)&&(revbuf[3]!=0xff))
return 1;
else
return 0;
}
u8_t test_get_config(void)
{
u8_t i;
u8_t revbuf[100]={0};
while(get_wifi_int_status());
emsp_cmd_get_config();
while(get_wifi_int_status());
spi_recv_data(95,revbuf);
for(i=0;i<95;i++)
{
printf("revbuf[%u]=%u\n",(u16_t)i,(u16_t)revbuf[i]);
}
}
u8_t test_wifi_start(void)
{
u8_t i;
u8_t revbuf[10]={0};
while(get_wifi_int_status());
emsp_cmd_start();
while(get_wifi_int_status());
spi_recv_data(10,revbuf);
for(i=0;i<10;i++)
{
printf("revbuf[%u]=%x\n",(u16_t)i,(u16_t)revbuf[i]);
}
}
u8_t test_scan_ap(void)
{
u8_t i;
u8_t revbuf[26]={0};
while(get_wifi_int_status());
emsp_cmd_scan_ap();
while(get_wifi_int_status());
spi_recv_data(26,revbuf);
for(i=0;i<26;i++)
{
printf("revbuf[%u]=%u\n",(u16_t)i,(u16_t)revbuf[i]);
}
if((revbuf[0]==4))
return 1;
else
return 0;
}
u8_t test_get_status(void)
{
u8_t i;
u8_t revbuf[14]={0};
emsp_cmd_get_status();
wait(10);
spi_recv_data(14,revbuf);
for(i=0;i<14;i++)
{
printf("revbuf[%u]=%x\n",(u16_t)i,(u16_t)revbuf[i]);
}
if((revbuf[2]==0x0e)&&(revbuf[4]==1))
return 1;
else
return 0;
}