287 lines
6.8 KiB
C
287 lines
6.8 KiB
C
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* IAR Development Kits
|
|||
|
|
* on the
|
|||
|
|
*
|
|||
|
|
* M451
|
|||
|
|
*
|
|||
|
|
* Filename : uart_Ethernet.h
|
|||
|
|
* Version : V1.00
|
|||
|
|
* Programmer(s) : Qian Xianghong
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
* INCLUDE FILES
|
|||
|
|
*********************************************************************************************************
|
|||
|
|
*/
|
|||
|
|
#include <includes.h>
|
|||
|
|
|
|||
|
|
// ETHERNET<45><54><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define ETHERNET_DATA_COUNT 200
|
|||
|
|
loopbuff_t Ethernet_Buff;
|
|||
|
|
uint8_t Ethernet_Buff_Data[sizeof(uint8_t) * (ETHERNET_DATA_COUNT + 1)] = {0};
|
|||
|
|
// ETHERNET<45><54><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5><EFBFBD>Ϣ֪ͨ
|
|||
|
|
SemaphoreHandle_t Ethernet_semQ = NULL;
|
|||
|
|
|
|||
|
|
// ETHERNET<45><54><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#define ETHERNET_ATDATA_COUNT 50
|
|||
|
|
loopbuff_t Ethernet_ATBuff;
|
|||
|
|
uint8_t Ethernet_ATBuff_Data[sizeof(uint8_t) * (ETHERNET_ATDATA_COUNT + 1)] = {0};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>״̬
|
|||
|
|
uint8_t Ethernet_initStatus = 0, Ethernet_connected = 0;
|
|||
|
|
|
|||
|
|
static void Ethernet_IRQHandler(USART_Handle *huart)
|
|||
|
|
{
|
|||
|
|
BaseType_t xHigherPriorityTaskWoken;
|
|||
|
|
|
|||
|
|
uint8_t c = (uint8_t) huart->Instance->DR;
|
|||
|
|
// <20><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
|||
|
|
LoopBuff_PutItem(&Ethernet_Buff, &c);
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
xSemaphoreGiveFromISR(Ethernet_semQ, &xHigherPriorityTaskWoken);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void Ethernet_ATHandler(USART_Handle *huart)
|
|||
|
|
{
|
|||
|
|
uint8_t c = (uint8_t) huart->Instance->DR;
|
|||
|
|
// <20><><EFBFBD>뻺<EFBFBD><EBBBBA>
|
|||
|
|
LoopBuff_PutItem(&Ethernet_ATBuff, &c);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Ethernet_Send(char *buf)
|
|||
|
|
{
|
|||
|
|
UART_Transmit(&huart3, (uint8_t *) buf, strlen(buf));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>жϷ<D0B6>ʽ<EFBFBD><CABD>ֱ<EFBFBD>ӴӴ<D3B4><D3B4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint16_t Ethernet_Recv(char *buf, uint16_t wait_cnt)
|
|||
|
|
{
|
|||
|
|
uint16_t recv_cnt = 0;
|
|||
|
|
uint32_t stop_seconds;
|
|||
|
|
char c;
|
|||
|
|
|
|||
|
|
stop_seconds = rf_get_seconds() + 2;
|
|||
|
|
while(rf_get_seconds() < stop_seconds)
|
|||
|
|
{
|
|||
|
|
if(LoopBuff_GetCount(&Ethernet_ATBuff) > 0)
|
|||
|
|
{
|
|||
|
|
c = *(uint8_t *) LoopBuff_GetDataPtr(&Ethernet_ATBuff, Ethernet_ATBuff.info.rdPtr);
|
|||
|
|
LoopBuff_RemoveItems(&Ethernet_ATBuff, 1);
|
|||
|
|
printf("%c", c);
|
|||
|
|
if(c != '\r' && c != '\n')
|
|||
|
|
{
|
|||
|
|
buf[recv_cnt++] = c;
|
|||
|
|
if(recv_cnt == wait_cnt)
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return recv_cnt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
uint8_t Ethernet_ATMode()
|
|||
|
|
{
|
|||
|
|
uint8_t try_cnt;
|
|||
|
|
char buf[3] = {0};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
for(try_cnt = 0; try_cnt < 3; try_cnt++)
|
|||
|
|
{
|
|||
|
|
// <20>Ƚ<EFBFBD><C8BD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
delay_ms(100);
|
|||
|
|
Ethernet_Send("+++");
|
|||
|
|
if(Ethernet_Recv(buf, 1) < 1 || buf[0] != 'a')
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
Ethernet_Send("a");
|
|||
|
|
if(Ethernet_Recv(buf, 3) < 3 || strncmp(buf, "+ok", 3) != 0)
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
// <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
delay_ms(100);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint8_t Ethernet_ATCmd(char *cmd, char *ok_str, char *err_str)
|
|||
|
|
{
|
|||
|
|
char buf[21], c;
|
|||
|
|
uint8_t try_cnt;
|
|||
|
|
uint16_t recv_cnt = 0;
|
|||
|
|
uint32_t stop_seconds;
|
|||
|
|
|
|||
|
|
memset(buf, 0, sizeof(buf));
|
|||
|
|
for(try_cnt = 0; try_cnt < 3; try_cnt++)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>մ<EFBFBD><D5B4>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
LoopBuff_Clear(&Ethernet_ATBuff);
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
Ethernet_Send(cmd);
|
|||
|
|
Ethernet_Send("\r");
|
|||
|
|
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
stop_seconds = rf_get_seconds() + 2;
|
|||
|
|
while(rf_get_seconds() < stop_seconds)
|
|||
|
|
{
|
|||
|
|
if(LoopBuff_GetCount(&Ethernet_ATBuff) > 0)
|
|||
|
|
{
|
|||
|
|
c = *(uint8_t *) LoopBuff_GetDataPtr(&Ethernet_ATBuff, Ethernet_ATBuff.info.rdPtr);
|
|||
|
|
LoopBuff_RemoveItems(&Ethernet_ATBuff, 1);
|
|||
|
|
printf("%c", c);
|
|||
|
|
if(c != '\r' && c != '\n')
|
|||
|
|
{
|
|||
|
|
buf[recv_cnt++] = c;
|
|||
|
|
if(strstr(buf, ok_str) != NULL)
|
|||
|
|
return 1;
|
|||
|
|
if(strstr(buf, err_str) != NULL)
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void Ethernet_Open()
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
LoopBuff_Create(&Ethernet_Buff, sizeof(uint8_t), ETHERNET_DATA_COUNT, 0, (uint32_t) Ethernet_Buff_Data);
|
|||
|
|
LoopBuff_Create(&Ethernet_ATBuff, sizeof(uint8_t), ETHERNET_ATDATA_COUNT, 0, (uint32_t) Ethernet_ATBuff_Data);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
|
|||
|
|
Ethernet_semQ = xSemaphoreCreateBinary();
|
|||
|
|
|
|||
|
|
SET_BIT(USART3->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE);
|
|||
|
|
LL_USART_Enable(USART3);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><C3B5>жϣ<D0B6>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD>ִ<EFBFBD><D6B4>
|
|||
|
|
void Ethernet_Config()
|
|||
|
|
{
|
|||
|
|
huart3.RxISR = Ethernet_ATHandler;
|
|||
|
|
|
|||
|
|
delay_ms(100);
|
|||
|
|
VCC_ETHERNET_ON();
|
|||
|
|
delay_ms(1000);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
Ethernet_initStatus = 0;
|
|||
|
|
Ethernet_connected = 0;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>Usr_K3<4B><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|||
|
|
#if 1
|
|||
|
|
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ
|
|||
|
|
if(!Ethernet_ATMode())
|
|||
|
|
return;
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB2BB><EFBFBD><EFBFBD>
|
|||
|
|
if(!Ethernet_ATCmd("AT+E=OFF", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>DHCP
|
|||
|
|
if(!Ethernet_ATCmd("AT+WANN=DHCP", "+OK", "+ERR"))
|
|||
|
|
// if(!Ethernet_ATCmd("AT+WANN=STATIC,192.168.0.3,255.255.255.0,192.168.0.1", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>DNS<4E><53><EFBFBD><EFBFBD>DHCP<43><50><EFBFBD>ÿɲ<C3BF><C9B2><EFBFBD>DNS)
|
|||
|
|
// if(!Ethernet_ATCmd("AT+DNS=202.106.0.20", "+OK", "+ERR"))
|
|||
|
|
// return;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>TCPģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>
|
|||
|
|
if(RF_APP == RF_APP_AJH)
|
|||
|
|
{
|
|||
|
|
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,171.88.5.52,8061", "+OK", "+ERR")) // <20><>˾·<CBBE><C2B7><EFBFBD><EFBFBD>
|
|||
|
|
if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,extra.cd-ls.cn,8061", "+OK", "+ERR"))
|
|||
|
|
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,data.ajhiot.com,8088", "+OK", "+ERR"))
|
|||
|
|
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,114.55.209.85,8088", "+OK", "+ERR")) // data.ajhiot.com
|
|||
|
|
// if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,192.168.0.2,8061", "+OK", "+ERR")) // ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else if(RF_APP == RF_APP_PRAX)
|
|||
|
|
{
|
|||
|
|
if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,tts.praxair.com.cn,7005", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(!Ethernet_ATCmd("AT+SOCKA1=TCPC,data.cd-ls.cn,8088", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>رմ<D8B1><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if(!Ethernet_ATCmd("AT+HEARTEN1=OFF", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20>رմ<D8B1><D5B4><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>
|
|||
|
|
if(!Ethernet_ATCmd("AT+REGEN1=OFF", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20>رն<D8B1><D5B6><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD>
|
|||
|
|
if(!Ethernet_ATCmd("AT+SOCKSL1=OFF", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20><><EFBFBD>ó<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD>䣺60<36><30>
|
|||
|
|
if(!Ethernet_ATCmd("AT+RSTIM=60", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ǰ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB>棿
|
|||
|
|
if(!Ethernet_ATCmd("AT+UARTCLBUF=ON", "+OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20><>ΪĬ<CEAA>ϲ<EFBFBD><CFB2><EFBFBD>
|
|||
|
|
if(!Ethernet_ATCmd("AT+CFGTF", "saved", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|||
|
|
if(!Ethernet_ATCmd("AT+Z", "OK", "+ERR"))
|
|||
|
|
return;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/* Enable UART3 interrupt */
|
|||
|
|
huart3.RxISR = Ethernet_IRQHandler;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>״̬
|
|||
|
|
Ethernet_initStatus = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
uint8_t Ethernet_IsConnected()
|
|||
|
|
{
|
|||
|
|
u8 try_count;
|
|||
|
|
u8 atMode = 0, connected = 0, tranMode = 0;
|
|||
|
|
|
|||
|
|
huart3.RxISR = Ethernet_ATHandler;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
LoopBuff_Clear(&Ethernet_ATBuff);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>3<EFBFBD>β<EFBFBD><CEB2>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
for(try_count = 0; try_count < 3; try_count++)
|
|||
|
|
{
|
|||
|
|
if(Ethernet_ATMode())
|
|||
|
|
{
|
|||
|
|
atMode = 1;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
osDelay(500);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(atMode)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
connected = Ethernet_ATCmd("AT+SOCKLKA1", "+OK=CONNECTED", "+OK=CONNECTING");
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><CDB8>ģʽ<C4A3><CABD>3<EFBFBD>β<EFBFBD><CEB2>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>λ
|
|||
|
|
for(try_count = 0; try_count < 3; try_count++)
|
|||
|
|
{
|
|||
|
|
if(Ethernet_ATCmd("AT+ENTM", "+OK", "+ERR"))
|
|||
|
|
{
|
|||
|
|
tranMode = 1;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
osDelay(500);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
huart3.RxISR = Ethernet_IRQHandler;
|
|||
|
|
|
|||
|
|
return (atMode && connected && tranMode);
|
|||
|
|
}
|