19.3. 应用示例

19.3.1. spi 作为主机 master 模式

19.3.1.1. spi master 初始化

通过调用 \ref gx_spi_master_init 接口初始化 spi 控制器和 spi 设备;spi 总线数据结构 \ref sflash_master,参数如下:

  • bus_num 为 spi 总线编号句柄,只有一个通用 spi,默认为 0;

  • spi 为 spi 设备;

  • list_head 为 spi 设备链表的头指针;

spi 设备数据结构 \ref spi_device,参数如下:

  • master 为 spi 设备所属的主机 spi 总线指针,填 NULL;

  • max_speed_hz 为 spi 设备最大时钟频率;

  • chip_select 为 cs 片选信号,只有一个 cs 信号,因此为 0;

  • bits_per_word 为 spi 传输位宽,可配置 8 或 32;

  • data_format 为 spi 传输模式,单线模式为 0;

  • mode 为 0,无作用;

示例代码如下:

    static struct sflash_master g_spi_master={
        .bus_num           = 0,
        .spi={
            .master        = NULL,
            .chip_select   = 0,
            .max_speed_hz  = 1000*1000,
            .mode          = 0,
            .bits_per_word = 8,
            .data_format = 0,
        },
    };

    gx_spi_master_init(&g_spi_master);

19.3.1.2. spi master 发送

通过 \ref gx_spi_tx 接口发送数据,参数如下:

  • spi 为 spi 设备;

  • buf 为要发送的数据 buffer;

  • len 为要发送数据的长度;

示例如下:

    uint8_t spi_test_buf[256];
    uint32_t len = 0x100;

    if(gx_spi_tx(&spi_master->spi, spi_test_buf, len) != 0)
    {
        printf("spi master tx failed,len: %d\r\n", len);
        return -1;
    }

19.3.1.3. spi master 接收

通过 \ref gx_spi_rx 接口接收数据,参数如下:

  • spi 为 spi 设备;

  • buf 为要接收的数据 buffer;

  • len 为要接收数据的长度;

示例如下:

    uint8_t spi_test_buf[256];
    uint32_t len = 0x100;

    if(gx_spi_rx(&spi_master->spi, spi_test_buf, len) != 0)
    {
        printf("spi master rx failed,len: %d\r\n", len);
        return -1;
    }

19.3.2. spi 作为从机 slave 模式

19.3.2.1. spi slave 初始化

通过调用 \ref gx_spi_slave_init 接口初始化 spi 总线和 spi 设备,参数 \ref spi_device 如下:

  • master 为 spi 总线指针,填 NULL,初始化时驱动内部自动赋值;

  • max_speed_hz 为 spi 设备最大时钟频率;

  • chip_select 为 0;

  • bits_per_word 为 spi 传输位宽,可配置 8 或 32;

  • data_format 为 spi 传输模式,单线模式为 0;

  • mode 为 0,无作用;

示例代码如下:

    static struct spi_device g_spi_slave={
                .master        = NULL,
                .chip_select   = 0,
                .max_speed_hz  = 1000*100,
                .mode          = 0,
                .bits_per_word = 8,
                .data_format = 0,
    };

    if((iRet = gx_spi_slave_init(&g_spi_slave)) != 0)
    {
        printf("gx_spi_slave_init error:%d\r\n",iRet);
    }

19.3.2.2. spi slave 发送

通过 \ref gx_spi_slave_tx 接口发送数据,参数如下:

  • spi 为 spi 设备;

  • buf 为要发送的数据 buffer;

  • len 为要发送数据的长度,如果使用异步 dma 传输模式时,len的长度需要大于 16 字节 (8bit 位宽) 或 64 字节 (32bit 位宽);

  • slave_completetion_cb 异步传输模式时的回调接口,为 NULL;

示例如下:

    uint8_t spi_test_buf[256];
    uint32_t len = 0x100;

    if(gx_spi_slave_tx(&g_spi_slave, spi_test_buf, len, NULL))
    {
        printf("spi slave write failed,len: %d\r\n", len);
        return -1;
    }

19.3.2.3. spi slave 接收

通过 \ref gx_spi_slave_rx 接口接收数据,参数如下:

  • spi 为 spi 设备;

  • buf 为要接收的数据 buffer;

  • len 为要接收数据的长度;

  • slave_completetion_cb 异步传输模式时的回调接口,为 NULL;

示例如下:

    uint8_t spi_test_buf[256];
    uint32_t len = 0x100;

    if(gx_spi_slave_rx(&g_spi_slave, spi_test_buf, len, NULL))
    {
        printf("spi slave read failed,len: %d\r\n", len);
        return -1;
    }