추가로 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 interrupt 핀(PB14)는 Idle 상태에서 High 상태를 유지 합니다.
SPI Enable PIN은 GND에 연결 확인 부탁 드립니다.
SPI mode 되면 Uart 쪽에는 메세지가 나오지 않습니다.
AT\r\n 을 전송하게 되면 아래와 같이 파형이 나옵니다.
확인 부탁드립니다.
그리고 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를 유지하는 원인에는 무엇이 있습니까?
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로 돌아갈 것입니다.
확인해 보시기 바랍니다.
말씀대로 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의 과정을 거쳐 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");
}
}
안녕하세요
nRF52DK보드를 저희가 가지고 있는 것이 아니라서 테스트 해볼수는 없습니다.
같은 3.3V 레벨이면 다른 문제는 없을 것으로 보입니다.
하지만 연결 전에는 데이터가 나오는데 연결되어서는 파형이 안나오는 것으로 봐서는 연결 회로쪽을 확인 해보셔야 할 것 같습니다.