蓝牙技术
直播中

TedLee

1年用户 10经验值
擅长:控制/MCU RF/无线
私信 关注
[经验]

nRF54L15初始化SPI

一、以下是基于NCS3.0.2的SPI初始化示例

1.1、主机

设备树

此配置将 SPI21 配置为主机,SCK/MOSI/MISO/CS 分别对应 P1.8/P1.12/P1.11/P2.10

设备树 overlay 示例
&pinctrl {
spi21_default: spi21_default {
group2 {
psels = ,
,
;
nordic,drive-mode = ;
};
};
};
(spim_miso,>(spim_sck,>(spim_mosi,>

&spi21 {
status = "okay";
pinctrl-0 = <&spi21_default>;
pinctrl-names = "default";
cs-gpios = <&gpio2 10 (GPIO_ACTIVE_LOW)>;
};

C 代码示例
#include #include #include #include 

#define SPI_DEV_NODE DT_NODELABEL(spi21)

void main(void)
{
const struct device *spi_dev = DEVICE_DT_GET(SPI_DEV_NODE);
if (!device_is_ready(spi_dev)) {
printk("SPI device not ready!\n");
return;
}

struct spi_cs_control cs_ctrl = {
    .gpio = GPIO_DT_SPEC_GET(SPI_DEV_NODE, cs_gpios),
    .delay = 0,
};

struct spi_config spi_cfg = {
    .frequency = 1000000,
    .operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB | SPI_OP_MODE_MASTER,
    .slave = 0,
    .cs = &cs_ctrl,
};

uint8_t tx_buf[5] = { 0x01, 0x02, 0x03, 0x04, 0x05 };
uint8_t rx_buf[5] = {0};

struct spi_buf tx_spi_buf = { .buf = tx_buf, .len = sizeof(tx_buf) };
struct spi_buf rx_spi_buf = { .buf = rx_buf, .len = sizeof(rx_buf) };
struct spi_buf_set tx = { .buffers = &tx_spi_buf, .count = 1 };
struct spi_buf_set rx = { .buffers = &rx_spi_buf, .count = 1 };

int ret = spi_transceive(spi_dev, &spi_cfg, &tx, &rx);
printk("SPI transceive ret: %d\n", ret);
printk("TX: %02x %02x %02x %02x %02x\n", tx_buf[0], tx_buf[1], tx_buf[2], tx_buf[3], tx_buf[4]);
printk("RX: %02x %02x %02x %02x %02x\n", rx_buf[0], rx_buf[1], rx_buf[2], rx_buf[3], rx_buf[4]);

}

此代码会通过 SPI 发送 5 字节数据,并打印发送和接收结果


SPI从机示例

SPIS overlay 示例
&pinctrl {
    spis22_default: spis22_default {
        group1 {
            psels = ,
                    ,
                    ,
                    ;
        };
    };
};
(spis_csn,>(spis_miso,>(spis_mosi,>(spis_sck,>

&spi22 {
compatible = "nordic,nrf-spis";
status = "okay";
pinctrl-0 = <&spis22_default>;
pinctrl-names = "default";
def-char = <0x00>;
};

C代码片段
static const struct spi_config spi_cfg = {
    .operation = SPI_WORD_SET(8) | SPI_TRANSFER_MSB | SPI_OP_MODE_SLAVE,
    .frequency = 1000000,
    .slave = 1,
};

const struct device *spi_dev = DEVICE_DT_GET(DT_NODELABEL(spi22));

void main(void)
{
uint8_t tx_buffer[32] = { 's', 'p', 'i', 's', 'l', 'a', 'v', 'e', '\n' };
uint8_t rx_buffer[32] = {0};

struct spi_buf tx_buf = { .buf = tx_buffer, .len = sizeof(tx_buffer) };
struct spi_buf rx_buf = { .buf = rx_buffer, .len = sizeof(rx_buffer) };
struct spi_buf_set tx = { .buffers = &tx_buf, .count = 1 };
struct spi_buf_set rx = { .buffers = &rx_buf, .count = 1 };

while (1) {
    int err = spi_transceive(spi_dev, &spi_cfg, &tx, &rx);
    printk("SPI error: %d\n", err);
    printk("TX buffer [0]: %x\n", tx_buffer[0]);
    printk("RX buffer [0]: %x\n", rx_buffer[0]);
    k_sleep(K_MSEC(1000));
}

}

从机书接收主机的数据,两个示例可以对测
有不懂的可以在主页添加我联系方式

更多回帖

发帖
×
20
完善资料,
赚取积分