RP2040(树莓派Pico) I2C/SPI/UART

/ 0评 / 7

这可以说是三个最常用的通信外设,他们的本质都一样,发送字节(这不是废话,以太网也是发送字节啊,只不过有规范.),他们只需要暴漏几个函数,读/写以及其他辅助函数,例如初始化/中断.

I2C技术参数:

SPI技术参数:

UART技术参数:

I2C软件上可以防止因为无设备的锁死,但是如果发生其他类型的锁死,还得使用防锁死的函数,但是要解决锁死状态,需要重置IO状态信息.其关键函数如下,其中nostop如果为true,则不发送stop,用于restart很有用.

SPI基本测试代码:


int main() {
    uint8_t buf1 = 0xAA;
    uint8_t buf2[2] = {0xA5,0x5A};

    spi_init(spi0, 1000 * 1000);
    spi_set_format(spi0,8,SPI_CPOL_0,SPI_CPHA_0,SPI_MSB_FIRST);
    gpio_set_function(PIN_MISO, GPIO_FUNC_SPI);
    gpio_set_function(PIN_SCK, GPIO_FUNC_SPI);
    gpio_set_function(PIN_MOSI, GPIO_FUNC_SPI);
    gpio_set_function(PIN_CS,GPIO_FUNC_SPI);

    for(;;){
        sleep_ms(5);
        spi_write_blocking(spi0, &buf1, 1);
        sleep_ms(5);
        spi_write_blocking(spi0, buf2, 2);
    }

    return 0;
}

另外由于FRF是没有函数设置的,所以我们要手动设置.

hw_write_masked(&spi_get_hw(spi0)->cr0,0 << SPI_SSPCR0_FRF_LSB,SPI_SSPCR0_FRF_BITS);

默认受硬件CS时候,时序结果是这样的.(不同FRF不同,具体参考手册.)

如果需要一个CS下连续发送数据,那么还要人工操作CS,但其实依然做不到最大带宽,感觉是设计缺陷.

UART本身配置在例子里面已经说的很清楚,如果我们要阻塞发送一个字节可以用uart_putc_raw函数来完成,另外读取函数都没有超时控制,所以要自己处理好.


OK,之前已经把所有的主机模式都说了,UART不分主从,因为这里没寻址模式,I2C和SPI都分,I2C部分的从机描述,从手册4.3.10.1.2开始,SPI部分的从机描述从4.4.3.15开始,由于SDK还没完善,现在只能用标志位判断各种先写着了.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注