SPI简介与实例分析

10 篇文章 0 订阅
1 篇文章 0 订阅

SPI简介

SPI 协议是由Motorola提出的通讯协议 (Serial Peripheral Interface) ,是一种高速全双工的串行通信总线。

SPI 通讯使用 3 条总线 :SCK、 MOSI、 MISO ,以及若干片选线(SS、CS、NSS)。

主机要和哪个从机通信,就把对应的片选线拉低,由高变低是起始信号,由低边高是停止信号



CPOL/CPHA 及通讯模式

时钟极性 CPOL 是指 空闲状态时SCK 的电平信号。CPOL=0 时, SCK 在空闲状态为低电平, CPOL=1 时则反之。

时钟相位 CPHA 是指数据的采样的时刻。当 CPHA=0 时, 信号将会在SCK 时钟线的“奇数边沿”被采样, CPOL=1 时则反之。

所以SPI就有4种通讯模式,实际中采用较多的是“模式 0”与“模式 3

模式CPOLCPHASCK空闲状态采样时刻
000低电平奇数边沿
101低电平偶数边沿
210高电平奇数边沿
311高电平偶数边沿



实例分析

逻辑分析仪图示

已知:SPI使用的是模式1,输入的数据是0x58 0x03,收到的数据是0x00 0x00 0x00 0xA4,和图示完全符合。

图片可能不太好放大看,文末提供源文件。

在这里插入图片描述


相关实验代码(ESP32)

void bl0942_init()
{
     esp_err_t ret;

    static spi_bus_config_t buscfg={
        .miso_io_num = PIN_NUM_MISO,
        .mosi_io_num = PIN_NUM_MOSI,
        .sclk_io_num = PIN_NUM_CLK,
        .quadwp_io_num = -1,
        .quadhd_io_num = -1,
        .max_transfer_sz = 1024
    };

    // 初始化spi
    ret = spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO);
    ESP_LOGI(TAG, "spi_bus_initialize = %d", ret);
    
    static spi_device_interface_config_t devcfg={
    .clock_speed_hz = 500 * 1000,
    .mode = 1,
    .spics_io_num = -1,     // 不使用片选
    .queue_size = 7,
    .pre_cb = NULL  //传输前的回调
    };

    // 添加从设备
    ret = spi_bus_add_device(SPI2_HOST, &devcfg, &gw_spi);
    ESP_LOGI(TAG, "spi_bus_add_device = %d", ret);
}

int bl0942_spi_r(uint8_t ICAddr, uint8_t cmd)
{
    int ret;
    uint8_t CHECKSUM = 0;
    spi_transaction_t t;
    memset(spi_tx_buf, 0, sizeof(spi_tx_buf));

    spi_tx_buf[0] = ICAddr;
    spi_tx_buf[1] = cmd;

    memset(&t, 0, sizeof(t));
    t.length = 8 * 6;
    t.tx_buffer= spi_tx_buf;
    t.rx_buffer= spi_rx_buf;
    t.user=(void*)0;

    ret = spi_device_polling_transmit(gw_spi, &t);
    if (ret != 0)
    {
        ESP_LOGE(TAG, "spi_device_polling_transmit err");
        return -1;
    }
    
    return 0;
}
                         
void bl0942_read_all()
{
    bl0942_spi_r(0x58, 0x03);
    ESP_LOG_BUFFER_HEX(TAG, spi_rx_buf+2, 4);
    // 00 00 00 a4
}



逻辑分析仪源文件

逻辑分析仪型号:Kingst LA1010

软件与源文件点击下载

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103是一款52MHz主频的ARM Cortex-M3内核微控制器,具有丰富的外设资源和强大的计算能力。ADS1220是一款24位精度的低功耗、低噪音、Delta-Sigma模数转换器,适用于电压、电流和电阻的测量应用。 在STM32F103和ADS1220的应用实例中,我们可以利用STM32F103的GPIO口和SPI接口与ADS1220进行通信。首先,我们需要配置STM32F103的GPIO口和SPI接口,并根据ADS1220的通信协议进行初始化设置。然后,我们可以通过SPI接口向ADS1220发送控制指令,例如启动转换、设置增益和采样速率等。同时,我们还可以通过SPI接口读取ADS1220转换后的数据。 在具体实例中,我们可以使用STM32F103的定时器和DMA功能实现自动定时采样,并将采样数据存储到内存中。通过ADS1220的24位精度和低噪音特性,我们可以获得高精度、低噪音的模拟信号测量结果。同时,可以利用STM32F103强大的计算能力对采样数据进行处理和分析,例如滤波、数据逻辑处理等。 除此之外,我们还可以结合其他外设资源,如LCD显示屏、按键、通信接口等,实现更加复杂的功能。例如,可以通过LCD显示屏实时显示ADS1220采样结果;通过按键实现启动和停止采样功能;通过通信接口(如UART或CAN总线)与外部设备进行数据交互和通信。 总之,STM32F103和ADS1220的应用实例可以实现高精度、低噪音的模拟信号测量和处理。通过充分利用STM32F103的外设资源和计算能力,我们可以灵活地设计和实现各种应用场景,满足不同的测量需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值