IT FUCKING WORKSSSSSSS
This commit is contained in:
@@ -15,25 +15,6 @@
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
|
||||
spi_slave_default: spi_slave_default {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIS_SCK, 1, 1)>,
|
||||
<NRF_PSEL(SPIS_MOSI, 1, 2)>,
|
||||
<NRF_PSEL(SPIS_MISO, 1, 3)>,
|
||||
<NRF_PSEL(SPIS_CSN, 1, 4)>;
|
||||
};
|
||||
};
|
||||
|
||||
spi_slave_sleep: spi_slave_sleep {
|
||||
group1 {
|
||||
psels = <NRF_PSEL(SPIS_SCK, 1, 1)>,
|
||||
<NRF_PSEL(SPIS_MOSI, 1, 2)>,
|
||||
<NRF_PSEL(SPIS_MISO, 1, 3)>,
|
||||
<NRF_PSEL(SPIS_CSN, 1, 4)>;
|
||||
low-power-enable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
my_spi_master: &spi3 {
|
||||
@@ -48,16 +29,3 @@ my_spi_master: &spi3 {
|
||||
};
|
||||
};
|
||||
|
||||
my_spi_slave: &spi1 {
|
||||
compatible = "nordic,nrf-spis";
|
||||
status = "okay";
|
||||
pinctrl-0 = <&spi_slave_default>;
|
||||
pinctrl-1 = <&spi_slave_sleep>;
|
||||
pinctrl-names = "default", "sleep";
|
||||
def-char = <0x00>;
|
||||
};
|
||||
|
||||
// By default uart1 will occupy P1.01 and P1.02. In order to make these pins available, disable uart1
|
||||
&uart1 {
|
||||
status="disabled";
|
||||
};
|
||||
|
||||
90
src/main.c
90
src/main.c
@@ -5,7 +5,7 @@
|
||||
#include <zephyr/drivers/spi.h>
|
||||
|
||||
/* 1000 msec = 1 sec */
|
||||
#define SLEEP_TIME_MS 1000
|
||||
#define SLEEP_TIME_MS 100
|
||||
|
||||
/* The devicetree node identifier for the "led0" alias. */
|
||||
#define LED0_NODE DT_ALIAS(led0)
|
||||
@@ -36,7 +36,7 @@ static void spi_init(void)
|
||||
|
||||
static const struct spi_config spi_cfg = {
|
||||
.operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB |
|
||||
SPI_MODE_CPOL | SPI_MODE_CPHA,
|
||||
SPI_MODE_CPHA,
|
||||
.frequency = 4000000,
|
||||
.slave = 0,
|
||||
.cs = &spim_cs,
|
||||
@@ -72,20 +72,14 @@ static int spi_write_test_msg(void)
|
||||
|
||||
// Reset signal
|
||||
k_poll_signal_reset(&spi_done_sig);
|
||||
|
||||
// Start transaction
|
||||
|
||||
int error = spi_transceive_async(spi_dev, &spi_cfg, &tx, &rx, &spi_done_sig);
|
||||
if(error != 0){
|
||||
printk("SPI transceive error: %i\n", error);
|
||||
return error;
|
||||
}
|
||||
|
||||
// Wait for the done signal to be raised and log the rx buffer
|
||||
int spi_signaled, spi_result;
|
||||
do{
|
||||
k_poll_signal_check(&spi_done_sig, &spi_signaled, &spi_result);
|
||||
} while(spi_signaled == 0);
|
||||
printk("SPI RX: 0x%.2x, 0x%.2x\n", rx_buffer[0], rx_buffer[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -93,72 +87,6 @@ static int spi_write_test_msg(void)
|
||||
const struct device *spi_slave_dev;
|
||||
static struct k_poll_signal spi_slave_done_sig = K_POLL_SIGNAL_INITIALIZER(spi_slave_done_sig);
|
||||
|
||||
static const struct spi_config spi_slave_cfg = {
|
||||
.operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB |
|
||||
SPI_MODE_CPOL | SPI_MODE_CPHA | SPI_OP_MODE_SLAVE,
|
||||
.frequency = 4000000,
|
||||
.slave = 0,
|
||||
};
|
||||
|
||||
static void spi_slave_init(void)
|
||||
{
|
||||
spi_slave_dev = DEVICE_DT_GET(MY_SPI_SLAVE);
|
||||
if(!device_is_ready(spi_dev)) {
|
||||
printk("SPI slave device not ready!\n");
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t slave_tx_buffer[2];
|
||||
static uint8_t slave_rx_buffer[2];
|
||||
static int spi_slave_write_test_msg(void)
|
||||
{
|
||||
static uint8_t counter = 0;
|
||||
|
||||
|
||||
const struct spi_buf s_tx_buf = {
|
||||
.buf = slave_tx_buffer,
|
||||
.len = sizeof(slave_tx_buffer)
|
||||
};
|
||||
const struct spi_buf_set s_tx = {
|
||||
.buffers = &s_tx_buf,
|
||||
.count = 1
|
||||
};
|
||||
|
||||
struct spi_buf s_rx_buf = {
|
||||
.buf = slave_rx_buffer,
|
||||
.len = sizeof(slave_rx_buffer),
|
||||
};
|
||||
const struct spi_buf_set s_rx = {
|
||||
.buffers = &s_rx_buf,
|
||||
.count = 1
|
||||
};
|
||||
|
||||
// Update the TX buffer with a rolling counter
|
||||
slave_tx_buffer[1] = counter++;
|
||||
printk("SPI SLAVE TX: 0x%.2x, 0x%.2x\n", slave_tx_buffer[0], slave_tx_buffer[1]);
|
||||
|
||||
// Reset signal
|
||||
k_poll_signal_reset(&spi_slave_done_sig);
|
||||
|
||||
// Start transaction
|
||||
int error = spi_transceive_async(spi_slave_dev, &spi_slave_cfg, &s_tx, &s_rx, &spi_slave_done_sig);
|
||||
if(error != 0){
|
||||
printk("SPI slave transceive error: %i\n", error);
|
||||
return error;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int spi_slave_check_for_message(void)
|
||||
{
|
||||
int signaled, result;
|
||||
k_poll_signal_check(&spi_slave_done_sig, &signaled, &result);
|
||||
if(signaled != 0){
|
||||
return 0;
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* A build error on this line means your board is unsupported.
|
||||
* See the sample documentation for information on how to fix this.
|
||||
@@ -180,11 +108,9 @@ void main(void)
|
||||
|
||||
spi_init();
|
||||
|
||||
spi_slave_init();
|
||||
|
||||
printk("SPI master/slave example started\n");
|
||||
|
||||
spi_slave_write_test_msg();
|
||||
|
||||
while (1) {
|
||||
spi_write_test_msg();
|
||||
@@ -193,13 +119,5 @@ void main(void)
|
||||
return;
|
||||
}
|
||||
k_msleep(SLEEP_TIME_MS);
|
||||
|
||||
if(spi_slave_check_for_message() == 0){
|
||||
// Print the last received data
|
||||
printk("SPI SLAVE RX: 0x%.2x, 0x%.2x\n", slave_rx_buffer[0], slave_rx_buffer[1]);
|
||||
|
||||
// Prepare the next SPI slave transaction
|
||||
spi_slave_write_test_msg();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
3584
zephyr.hex
3584
zephyr.hex
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user