I am using raspberry pi to communicate with nrf52840
My rpi is used as msater, nrf52840 is used as slave
My nrf52840 is implemented as SPI slave under zephyr OS
At present, I found that when rpi uses spi to transfer data to nrf52840, there will be a problem that the transfer is not successful
I wonder if the frequency of my nrf52840 SPI and rpi SPI is not the same
I want to ask what is the SPI default frequency of nrf52840?
I can't find how much it is.
I only see the initialization function, but there is no place to set the frequency
nrfx_spis_init(&spis_t,&spis_config_t,spis_event_handler_t,NULL);
So I want to change the frequency of my RPi SPI
The current settings of my rpi are as follows
spi=spidev.SpiDev() spi.open() spi.max_speed_hz=976000
Or how can I set the SPI slave frequency of my nrf52840 to 976000?
My nrf52840 SPI slave on Zephyr OS is set as follows
#include <zephyr.h> #include <sys/printk.h> #include "nrfx_spis.h" #define PIN_SCK 29 #define PIN_MOSI 31 #define PIN_MISO 30 #define PIN_CSN 28 #define SPIS_NR 0 #include <devicetree.h> #include <drivers/gpio.h> #define LED0_NODE DT_ALIAS(led2) #define LED0 DT_GPIO_LABEL(LED0_NODE, gpios) #define PIN 3 #define FLAGS DT_GPIO_FLAGS(LED0_NODE, gpios) const struct device *led; nrfx_spis_t spis_t = NRFX_SPIS_INSTANCE(SPIS_NR); nrfx_spis_config_t spis_config_t = NRFX_SPIS_DEFAULT_CONFIG(PIN_SCK,PIN_MOSI,PIN_MISO,PIN_CSN); uint8_t readend=0; uint8_t rx_buffer[8]; uint8_t tx_buffer[8]; uint8_t tmpbuffer[8] = {0}; void spis_event_handler_t(nrfx_spis_evt_t const *p_event, void *p_context){ //printk("received\n"); int err; switch(p_event->evt_type){ case NRFX_SPIS_XFER_DONE: if(rx_buffer[0] && rx_buffer[0]!= 255) { printk("read"); for(int i=0;i<8;i++){ printk("%d ",rx_buffer[i]); } printk("\r\n"); } err = nrfx_spis_buffers_set(&spis_t, tx_buffer, sizeof(tx_buffer), rx_buffer, sizeof(rx_buffer)); if(err != NRFX_SUCCESS){ printk("Error with setting.\n"); } readend=1; break; default: ; } } static void manual_isr_setup() { IRQ_DIRECT_CONNECT(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn, 0, nrfx_spis_0_irq_handler, 0); irq_enable(SPIM0_SPIS0_TWIM0_TWIS0_SPI0_TWI0_IRQn); } void init_spis(){ int err; err = nrfx_spis_init(&spis_t,&spis_config_t,spis_event_handler_t,NULL); if(err != NRFX_SUCCESS){ printk("Error with init.\n"); } else { printk("SPIS started.\n"); } } void main(void) { int err,k=0,ret; init_spis(); bool low = true; bool high =! low; led = device_get_binding(LED0); if (led == NULL) { return; } ret = gpio_pin_configure(led, PIN, GPIO_OUTPUT_ACTIVE | FLAGS); if (ret < 0) { return; } gpio_pin_set(led, PIN, (int)low); manual_isr_setup(); err = nrfx_spis_buffers_set(&spis_t, tx_buffer, sizeof(tx_buffer), rx_buffer, sizeof(rx_buffer)); if(err != NRFX_SUCCESS){ printk("Error with setting.\n"); } while(true){ if(readend==1){ gpio_pin_set(led, PIN, (int)low); tx_buffer[0] = 5; tx_buffer[1] = 24;//message from printk("write "); for(int i = 0 ; i< 8 ; i++) tx_buffer[i] = k+i; k++; for(int i = 0 ; i< 8 ; i++) printk("%d ",tx_buffer[i]); printk("\r\n"); gpio_pin_set(led, PIN, (int)high); gpio_pin_set(led, PIN, (int)low); readend=0; } } }
Thank,
Po-I