noname
1
한국어 포럼에 작성하였는나 답변이 없어 이전하여 올립니다.
원문 : [WizFi360] SPI사용에 있어 AT 커맨드 확인
WizFi 360을 SPI로 이용하여 개발중에 있습니다.
FW 는 1.1.0.7 버전입니다.
일반적인 AT 커맨드는 "OK"를 회신하는데
(AT+CWMODE_CUR , AT+CWDHCP, AT+CWSAP_CUR 등.)
IP주소가 들어간 명령가 입력되면 “ERROR” 을 반환합니다.
다음은 SPI 송신 데이터에 대한 응답입니다.
-
“AT+CWDHCP_CUR=0,1\r\n” → “ok” 반환
→ “AT+CIPAP_CUR=“192.168.10.2”,“192.168.10.1”,“255.255.255.0”\r\n” → ERROR 반환
91 3C 00 41 54 2B … 0D 0A, Length : 63(3 + 60)
잘못보내고 있는것 인가요?
Viktor
3
안녕 하세요.
ST Nucleo F411RE + WizFi360EVB로 IP주소가 들어간 명령을 테스트했는데 “ERROR”을 반환하는 경우가 없었습니다.
다음 SPI 관련 서류 참고하시기 바랍니다.
http://wizwiki.net/wiki/lib/exe/fetch.php/products:wizfi360:wizfi360app:wizfi360_an_spi_e_101_1.pdf
정확한 파악을 하기 위하여 환경 설정을 어떻게 하셨는지 알려주시면 더 많은 테스트를 하겠습니다.
noname
4
확인하였습니다.
SPI로 명령 송신시 CMD LENGTH 설정 부분에서 문제가 있었습니다.
D0 : 0x91(AT 커맨드 송신 명령)
D1 : 명령길이(ATCommand_String)Low 8bit
D2 : 명령길이(ATCommand_String)High 8bit
D3…Dn : 명령문
기존에 작성한 함수에서는 D1,D2의 길이를 제외하고 4의 배수로 하여 송신하였습니다.
그러나 예제로 주신 프로젝트와 같이 AT 문자열 길이를 전달하는 D1,D2를 포함하여 4의 배수로 하니 정상동작 되는 것을 확인하였습니다. .
아래는 예제의 소스 파일 중 일부 입니다.
//SPI SEND Message
void SPI_SEND(uint8_t type, uint8_t *data, uint16_t len)
{
#if 1
//int i;
//HAL_UART_Transmit(&huart1, data, len, 0xFFFF);
//read TX_BUFF_AVAIL
uint8_t temp_CMD, retry = 0, err = 0, dum2=0x00;
uint16_t SPI_RX_REG = 0, TX_len;
int temp_delay = 10000;
memset(SPI_TX_BUFF,0, sizeof(SPI_TX_BUFF));
temp_CMD = SPI_REG_TX_BUFF_AVAIL;
//중략 ...
TX_len = len + 2; //**** CMD Length Phase 길이 추가하는 부분 ,Line No. 571
if(TX_len % 4)
{
TX_len = ((TX_len + 3)/4) << 2;
//TX_len = (TX_len + 3) & 0xFFFC;
}
//중략 ...
SPI_CS_OFF;
if(type)
{
temp_CMD = SPI_CMD_TX_DATA;
}
else
{
temp_CMD = SPI_CMD_TX_CMD;
}
HAL_SPI_TransmitReceive(&hspi1, &temp_CMD, &dum2, 1, 10);
memcpy(SPI_TX_BUFF , &len, sizeof(len));
memcpy(SPI_TX_BUFF + 2, data, len);
HAL_SPI_TransmitReceive(&hspi1, SPI_TX_BUFF, RX_BUFFER, TX_len, 10);
SPI_CS_ON;
// 이후부분 생략
그러나 이부분은 어플리케이션 노트 에서는 누락된 내용인것 같아서요.
(어플리케이션 노트 - SPI, 1.0.3 )
CMD Length Phase 에 CMD Length Byte 길이또한 포함 되어야 한다고 되어 있는 부분이 확인되지 않습니다.
추후 보안 요청드립니다.
감사합니다.