wizfi360 spi 통신

안녕하세요 MCU와 Wizfi360사이에 SPI 통신을 구현하려고 합니다.
펌웨어는 1.1.0.7로 업그레이드 하였고 SPI_ENABLE 핀을 LOW로 변경하는데에 문제가 있습니다.

SPI_ENABLE(11번 핀)을 OUTPUT MODE로 설정하고 LOW LEVEL을 인가하였으나 실제 핀의 값은 HIGH로 나타납니다.

PC에 usb 연결하여 시리얼 프로그램에서 AT 커맨드,
AT+SYSGPIOREAD로 11번 핀을 읽었을 때 11,1,0의 응답을 봐서는 LOW로 인가 된 것 같은데 실제로 DMM으로 확인하면 HIGH입니다…

혹시 SPI통신을 하기위한 위의 과정이 잘못된 것인지 질문드립니다.

********수정
어제 도착한 보드를 살펴보니 SPI ENABLE할 수 있는 스위치가 추가 되어 있는것을 뒤늦게 확인하였습니다. 관련 최신 자료를 업로드 부탁드립니다.

그러면 후에 Wizfi360-PA 또는 -CON 에서 SPI 모드를 사용하기 위해 SPI ENABLE 핀에 대해 GPIO 설정 필요없이 GND에 연결하면 바로 SPI 모드 사용 가능한게 맞나요?

추가로 wizfi360과 spi통신하는데에 문제가 있어 답글로 질문드립니다.TX BUFF AVAIL에 대해 커맨드 전송하면
0X0002가 수신되고 다음에 CONTROL PHASE에 0X91과LENGTH, AT CMD를 입력하였으나 INT STATUS에 대한 응답이 오질 않습니다.

NRF52DK를 이용해 SPI 테스트 중이고 사용한
AT CMD는 uint8_t check_version[8] = “AT+GMR\r” 입니다. 혹시 SPI테스트 예제를 받거나 AT CMD FORMAT을 알려줄 수 있나요?

안녕하세요
SPI Enable Pin 은 GND Pin에 연결하면 SPI 모드로 동작하게 됩니다.
AT CMD는 AT Command set 문서를 참고 하시면 됩니다.
위에서 버전 정보에 대한 AT CMD 는 "AT+GMR\r\n"입니다.
git hub 주소 참조 합니다. 이 프로그램을 참고 하시면 될 것입니다.

감사합니다.

답변감사합니다 teddy,
github를 참고하여 코드 작성중인데 여전히 동작하지 않습니다.

일단 SPI MODE가 MODE3으로 동작하는 것이 맞습니까?
또한 AT+GMR\r\n 을 전송하기 전과 후 모두 spi interrupt 핀(PB14)가 항상 LOW인데 맞는 현상입니까?
오실로스코프로 MOSI를 살펴보면 AT+GMR\r\n을 전송하면 동시에 수신버퍼에 데이터가 들어오는데 맞는 현상인지 알려주시면 감사하겠습니다.

안녕하세요
SPI MODE 설정은 아래와 같습니다. CPOL = 0 CPHA = 0 입니다.
image
spi interrupt 핀(PB14)는 Idle 상태에서 High 상태를 유지 합니다.
SPI Enable PIN은 GND에 연결 확인 부탁 드립니다.
SPI mode 되면 Uart 쪽에는 메세지가 나오지 않습니다.
AT\r\n 을 전송하게 되면 아래와 같이 파형이 나옵니다.
image
image
확인 부탁드립니다.
그리고 AT CMD전송시에 4byte씩 맞춰서 보내셔야 합니다. 4,8,12… 이렇게 맞춰서 보내시는데 모자라면 더미채워서 보내야 합니다.
Git hub의 소스코드를 참조 하시기 바랍니다.
그리고 하드웨어 셋팅은 ST cubeMX 프로젝트도 있으니 참고 하시기 바랍니다.
감사합니다.

답변 감사합니다. 저는 STM 보드 대신 NRF52보드를 이용중이여서 SPI 신호의 타이밍이 다르지만 충분히 도움이 되었습니다.

죄송하지만 몇가지 질문을 다시 드리겠습니다.
1.
데이터 시트대로라면
MOSI[3] : 0x03(TX BUFF AVAIL) 0x00 0x00
MISO[3] : 0x00 0x00 0x00 으로 수신된 MISO 데이터가 (MISO[2]<<8 | MISO[1]) =0x0002이면 두번째 사진과 같이 전송을 하라고 나옵니다.
첫번째 사진에서 MOSI에 해당하는 자세한 데이터가 무엇입니까?

만약 데이터시트처럼 1과 같이 동작시켰고 SPI ENABLE 핀이 Boot 시에 LOW 임을 확인했는데도 SPI INT 핀이 초기에 LOW, SPI 통신 중에도 여전히 LOW를 유지하는 원인에는 무엇이 있습니까?

안녕하세요
보드는 다르겠지만 쓰임새는 비슷할 것입니다.
STM 에서는 HAL_SPI_TransmitReceive함수가 SPI send recv 동시함수 입니다.

TX BUFF AVAIL 은 첫 바이트 0x03을 보내고 두바이트를 받아서 두번째 bit가 1인지 확인하는 것입니다.
(0 == (SPI_RX_REG & 0x02))
MOSI에 대한 데이터는 두번째 그림입니다.
TX BUFF AVAIL 통과 하면 0x91 Length 이후 AT CMD 를 넣어서 보내시면 됩니다. 길이는 4tbyte 단위 입니다.
TX_len = len + 2;
if(TX_len % 4)
{
TX_len = ((TX_len + 3)/4) << 2;
}
참고 하시기 바랍니다.

Low를 유지하고 있다면 무언가 SPI buffer 쪽에서 데이터가 들어와 있을 것입니다.
아마도 시작 하고나면 READY 메세지가 들어와 있을 것입니다.
SPI 데이터를 읽으면 High로 돌아갈 것입니다.
확인해 보시기 바랍니다.

감사합니다.

안녕하세요 teddy,
또 질문드립니다…

말씀대로 TX BUFF AVAIL(0x03)을 쓰기전에 임의 길이의 데이터를 PB14(INT) 핀이 HIGH가 될 때까지 READ하고 나면 AT+SYSGPIOWRITE=20,1 과 같이 응답없이 확인가능한 커맨드는 잘 작동합니다.

하지만 이에 대한 응답을 확인하기 위해 INT_STATUS의 값을 읽으면 0, RX_DATA_LEN의 값도 0이 수신됩니다. 임의의 데이터 길이를 READ(0x10)하면 쓰레기값이 수신됩니다.

문제를 정리하면,
1.전에 Interrupt pin이 LOW 였던 문제를 코드 main문 처음에 Interrupt pin이 HIGH가 될 때까지 임의의 길이 데이터를 여러번 READ하면 해결할 수 있으나 "ready\r\n"의 데이터를 확인할 수 없었고, INT STATUS, RX DATA LEN에 대한 응답이 오지 않아 임의의 길이를 READ하여야 했습니다.

  1. 문제1과 비슷합니다. 1의 과정을 거쳐 TX BUFF AVAIL의 값이 0x0002임을 확인한 후에,
    AT+SYSGPIOWRITE=20,1 와 같이 응답없이 결과를 확인가능한 커맨드를 입력후에 20핀(PB8)이 HIGH가 됨을 확인할 수 있으나 INT STATUS, RX DATA LEN에 대해 기대하는 값이 나오지 않습니다.

위 문제에 대한 해결을 어떤 방법으로 할 수 있을까요…?

구현한 코드를 참고하시라고 아래에 작성하겠습니다.

uint16_t SPI_Read_Register(uint8_t CMD){
   uint8_t tx_temp[3]={CMD,0x00,0x00},rx_temp[3]={0x00,0x0,0x0};
   uint16_t ret = 0;

   nrf_drv_spi_transfer(&spi, tx_temp,sizeof(tx_temp),rx_temp, 
   sizeof(rx_temp));
  nrf_delay_us(1000);

  ret = rx_temp[1] | (rx_temp[2] << 8);
  return ret;
}
                                                                                                                              
int main() {
   while(nrf_gpio_pin_read(PIN_IN) != 0x1){  	
     nrf_drv_spi_transfer(&spi,rx_data_array,6,rx_data,6);
     nrf_delay_us(1000);
   } //WAIT for Interrupt is HIGH	

   while(1){ // Repeat spi communication            

     SPI_RX_REG=0;
     while((SPI_RX_REG != 0xffff) && (0 == (SPI_RX_REG & 0x02))){
	   SPI_RX_REG = SPI_Read_Register(TX_BUFF_AVAIL);
     }
    
   nrf_drv_spi_transfer(&spi,tx_data_array,length+1,hex00,length+1);
   //AT CMD Transfer
   while(nrf_gpio_pin_read(PIN_IN) != 0x0){}; //WAIT for Interrupt is LOW

  SPI_RX_REG = SPI_Read_Register(INT_STATUS);	
  if(SPI_RX_REG == 0x0001){
	SPI_RX_REG = SPI_Read_Register(RX_DATA_LEN);
		
	if(SPI_RX_REG > 0) { 

       nrf_drv_spi_transfer(&spi,rx_data_array,SPI_RX_REG+1,rx_data,SPI_RX_REG+1);	//Read data
	   for(int i=0;i<SPI_RX_REG+1;i++) NRF_LOG_RAW_INFO("%02x ",rx_data[i]);
				NRF_LOG_RAW_INFO("\r\n");
				
		}
	}

계속 테스트 해본 결과 wizfi360의 miso와 nrf52dk의 miso가 연결되면 miso 데이터가 제대로 출력되지 않습니다.

두 보드 사이 연결된 miso를 제거한 뒤 오실로스코프로 파형을 확인하면 처음에 "\r\nready"가 확인됩니다.

짧은 선을 이용하여 연결하여도, nrf52dk에 wizfi360을 그대로 꽂아도 문제가 발생합니다.

혹시 해결 방법이 있을까요?

안녕하세요
nRF52DK보드를 저희가 가지고 있는 것이 아니라서 테스트 해볼수는 없습니다.
같은 3.3V 레벨이면 다른 문제는 없을 것으로 보입니다.
하지만 연결 전에는 데이터가 나오는데 연결되어서는 파형이 안나오는 것으로 봐서는 연결 회로쪽을 확인 해보셔야 할 것 같습니다.