static int spi_resp_len(void)
{
uint16_t temp = 0;
uint8_t a,b;
uint8_t cmd = SPI_REG_INT_STTS;
int recv_len = 0;
while (1) {
CS_LOW;
csi_spi_send(&spi_handle, &cmd, 1, AOS_WAIT_FOREVER);
csi_spi_receive(&spi_handle, &a, 1, AOS_WAIT_FOREVER);
csi_spi_receive(&spi_handle, &b, 1, AOS_WAIT_FOREVER);
CS_HIGH;
temp = a | (b << 8);
if((temp != 0xffff) && (temp & 0x01)) {
cmd = SPI_REG_RX_DAT_LEN;
CS_LOW;
csi_spi_send(&spi_handle, &cmd, 1, AOS_WAIT_FOREVER);
csi_spi_receive(&spi_handle, &a, 1, AOS_WAIT_FOREVER);
csi_spi_receive(&spi_handle, &b, 1, AOS_WAIT_FOREVER);
CS_HIGH;
recv_len = a | (b << 8);
break;
}
aos_msleep(100);
}
return recv_len;
}
static void at_spi_recv_task(void *priv)
{
int len = 0;
uint8_t *recv = NULL;
while(1) {
aos_sem_wait(&spi_recv_sem, AOS_WAIT_FOREVER);
len = spi_resp_len();
if (len)
recv = aos_malloc_check(len);
else
continue;
spi_recv(recv, len);
while (ringbuffer_available_write_space(&spi_ringbuffer) < (len -1)) {
aos_msleep(100);
}
int w_len = ringbuffer_write(&spi_ringbuffer, recv, len-1);
if (w_len != (len-1)) {
LOGD(TAG, "spi buffer is full\r\n");
} else {
spi_channel_cb(AT_CHANNEL_EVENT_READ, spi_channel_priv);
}
if (recv) {
aos_free(recv);
recv = NULL;
}
}
}
static void *at_spi_init(const char *name, void *config)
{
int ret = 0;
csi_pin_set_mux(PA16, PA16_SPI0_SCK);
csi_pin_set_mux(PA17, PA17_SPI0_MOSI);
csi_pin_set_mux(PA18, PA18_SPI0_MISO);
csi_pin_set_mux(PA15, PIN_FUNC_GPIO);
csi_pin_set_mux(PA22, PIN_FUNC_GPIO);
csi_gpio_pin_init(&spi_int_pin, PA22);
csi_gpio_pin_dir(&spi_int_pin,GPIO_DIRECTION_INPUT);
csi_gpio_pin_mode(&spi_int_pin,GPIO_MODE_PULLNONE);
csi_gpio_pin_debounce(&spi_int_pin, true);
csi_gpio_pin_attach_callback(&spi_int_pin, spi_in_int_cb, NULL);
csi_gpio_pin_irq_mode(&spi_int_pin,GPIO_IRQ_MODE_FALLING_EDGE);
csi_gpio_pin_irq_enable(&spi_int_pin, 1);
csi_gpio_pin_init(&spi_cs_pin, PA15);
csi_gpio_pin_mode(&spi_cs_pin,GPIO_MODE_PULLUP);
csi_gpio_pin_dir(&spi_cs_pin,GPIO_DIRECTION_OUTPUT);
CS_HIGH;
csi_gpio_pin_init(&spi_wakeup_pin, PA25);
csi_gpio_pin_mode(&spi_wakeup_pin,GPIO_MODE_PULLUP);
csi_gpio_pin_dir(&spi_wakeup_pin,GPIO_DIRECTION_OUTPUT);
csi_gpio_pin_write(&spi_wakeup_pin, GPIO_PIN_HIGH);
ret = csi_spi_init(&spi_handle, 0);
if (ret < 0) {
printf("csi spi init failed\r\n");
return NULL;
}
csi_spi_mode(&spi_handle, SPI_MASTER);
ret = csi_spi_baud(&spi_handle, 1*1000000);
LOGD(TAG, "#######################spi speed:%d\r\n", ret);
csi_spi_cp_format(&spi_handle, SPI_FORMAT_CPOL0_CPHA0);
csi_spi_frame_len(&spi_handle, SPI_FRAME_LEN_8);
csi_spi_select_slave(&spi_handle, 0);
aos_task_t task;
ret = aos_sem_new(&spi_recv_sem, 0);
ret = aos_task_new_ext(&task, "spi_recv", at_spi_recv_task, NULL, 1536, 9);
spi_recv_buffer = (char *)aos_malloc_check(SPI_RX_BUFFER_LEN);
ringbuffer_create(&spi_ringbuffer, spi_recv_buffer, SPI_RX_BUFFER_LEN);
return (void*)1;
}
at_channel_t spi_channel = {
.init = at_spi_init,
.set_event = at_spi_set_event,
.send = at_spi_send,
.recv = at_spi_recv,
};