mirror of
https://github.com/Fishwaldo/bl_mcu_sdk.git
synced 2025-07-12 07:48:42 +00:00
[doc] update demo rst
This commit is contained in:
parent
dd161b698b
commit
24d03e890b
42 changed files with 2148 additions and 691 deletions
92
docs/source/samples/peripherals/i2c/i2c_10_bit.rst
Normal file
92
docs/source/samples/peripherals/i2c/i2c_10_bit.rst
Normal file
|
@ -0,0 +1,92 @@
|
|||
I2C - 10-bit
|
||||
====================
|
||||
|
||||
本 demo 主要介绍 I2C 10-bit slave 模式数据传输。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 USB 转 I2C 模块与开发板连接,具体引脚连接方式如下表(以BL616为例):
|
||||
|
||||
.. table:: 硬件连接
|
||||
:widths: 50, 50
|
||||
:width: 80%
|
||||
:align: center
|
||||
|
||||
+-------------------+------------------+
|
||||
| 开发板 I2C 引脚 | USB 转 I2C 模块 |
|
||||
+===================+==================+
|
||||
| SCL(GPIO14) | SCL |
|
||||
+-------------------+------------------+
|
||||
| SDA(GPIO15) | SDA |
|
||||
+-------------------+------------------+
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
更详细的代码请参考 **examples/peripherals/i2c/i2c_10_bit**
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_init();
|
||||
|
||||
- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_i2c0_gpio_init();
|
||||
|
||||
- 配置相关引脚为 `I2C` 功能
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
i2c0 = bflb_device_get_by_name("i2c0");
|
||||
|
||||
bflb_i2c_init(i2c0, 400000);
|
||||
|
||||
- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
struct bflb_i2c_msg_s msgs[2];
|
||||
uint8_t subaddr[2] = { 0x00, 0x04};
|
||||
uint8_t write_data[I2C_10BIT_TRANSFER_LENGTH];
|
||||
|
||||
/* Write buffer init */
|
||||
write_data[0] = 0x55;
|
||||
write_data[1] = 0x11;
|
||||
write_data[2] = 0x22;
|
||||
for (size_t i = 3; i < I2C_10BIT_TRANSFER_LENGTH; i++) {
|
||||
write_data[i] = i;
|
||||
}
|
||||
|
||||
/* Write data */
|
||||
msgs[0].addr = I2C_10BIT_SLAVE_ADDR;
|
||||
msgs[0].flags = I2C_M_NOSTOP | I2C_M_TEN;
|
||||
msgs[0].buffer = subaddr;
|
||||
msgs[0].length = 2;
|
||||
|
||||
msgs[1].addr = I2C_10BIT_SLAVE_ADDR;
|
||||
msgs[1].flags = 0;
|
||||
msgs[1].buffer = write_data;
|
||||
msgs[1].length = I2C_10BIT_TRANSFER_LENGTH;
|
||||
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
|
||||
- 初始化发送数据(write_data)和配置从设备信息(msgs)
|
||||
- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
通过串口(波特率大于115200)发送``04 00 06 01 03 55``命令给 USB 转 I2C 模块,设置 I2C 从机 10-bit 模式数据传输。
|
||||
按下开发板中 RST 按键,串口打印开发板发送的 write_data 数据。
|
120
docs/source/samples/peripherals/i2c/i2c_eeprom.rst
Normal file
120
docs/source/samples/peripherals/i2c/i2c_eeprom.rst
Normal file
|
@ -0,0 +1,120 @@
|
|||
I2C - eeprom
|
||||
====================
|
||||
|
||||
本 demo 主要介绍 I2C 读写 eeprom。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例):
|
||||
|
||||
.. table:: 硬件连接
|
||||
:widths: 50, 50
|
||||
:width: 80%
|
||||
:align: center
|
||||
|
||||
+-------------------+------------------+
|
||||
| 开发板 I2C 引脚 | eeprom 模块 |
|
||||
+===================+==================+
|
||||
| SCL(GPIO14) | SCL |
|
||||
+-------------------+------------------+
|
||||
| SDA(GPIO15) | SDA |
|
||||
+-------------------+------------------+
|
||||
| GND | GND |
|
||||
+-------------------+------------------+
|
||||
| VCC | VCC |
|
||||
+-------------------+------------------+
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
更详细的代码请参考 **examples/peripherals/i2c/i2c_eeprom**
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_init();
|
||||
|
||||
- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_i2c0_gpio_init();
|
||||
|
||||
- 配置相关引脚为 `I2C` 功能
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
i2c0 = bflb_device_get_by_name("i2c0");
|
||||
|
||||
bflb_i2c_init(i2c0, 400000);
|
||||
|
||||
- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
struct bflb_i2c_msg_s msgs[2];
|
||||
uint8_t subaddr[2] = { 0x00, EEPROM_SELECT_PAGE0};
|
||||
uint8_t write_data[256];
|
||||
|
||||
/* Write and read buffer init */
|
||||
for (size_t i = 0; i < 256; i++) {
|
||||
write_data[i] = i;
|
||||
read_data[i] = 0;
|
||||
}
|
||||
|
||||
/* Write page 0 */
|
||||
msgs[0].addr = 0x50;
|
||||
msgs[0].flags = I2C_M_NOSTOP;
|
||||
msgs[0].buffer = subaddr;
|
||||
msgs[0].length = 2;
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = 0;
|
||||
msgs[1].buffer = write_data;
|
||||
msgs[1].length = EEPROM_TRANSFER_LENGTH;
|
||||
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
|
||||
- 初始化发送数据(write_data),接收buffer和配置从设备信息(msgs)
|
||||
- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
uint8_t read_data[256];
|
||||
|
||||
/* Read page 0 */
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = I2C_M_READ;
|
||||
msgs[1].buffer = read_data;
|
||||
msgs[1].length = EEPROM_TRANSFER_LENGTH;
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
|
||||
- 读取从设备寄存器地址中的数据,存放至 read_data 中
|
||||
- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Check read data */
|
||||
for (uint8_t i = 0; i < EEPROM_TRANSFER_LENGTH; i++) {
|
||||
if (write_data[i] != read_data[i]) {
|
||||
printf("check fail, %d write: %02x, read: %02x\r\n", i, write_data[i], read_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
- 检查发送和读取的数据是否一致
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。
|
202
docs/source/samples/peripherals/i2c/i2c_eeprom_dma.rst
Normal file
202
docs/source/samples/peripherals/i2c/i2c_eeprom_dma.rst
Normal file
|
@ -0,0 +1,202 @@
|
|||
I2C - eeprom_dma
|
||||
====================
|
||||
|
||||
本 demo 主要介绍 I2C 使用 DMA 的方式读写 eeprom。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例):
|
||||
|
||||
.. table:: 硬件连接
|
||||
:widths: 50, 50
|
||||
:width: 80%
|
||||
:align: center
|
||||
|
||||
+-------------------+------------------+
|
||||
| 开发板 I2C 引脚 | eeprom 模块 |
|
||||
+===================+==================+
|
||||
| SCL(GPIO14) | SCL |
|
||||
+-------------------+------------------+
|
||||
| SDA(GPIO15) | SDA |
|
||||
+-------------------+------------------+
|
||||
| GND | GND |
|
||||
+-------------------+------------------+
|
||||
| VCC | VCC |
|
||||
+-------------------+------------------+
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
更详细的代码请参考 **examples/peripherals/i2c/i2c_eeprom_dma**
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_init();
|
||||
|
||||
- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_i2c0_gpio_init();
|
||||
|
||||
- 配置相关引脚为 `I2C` 功能
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Send and receive buffer init */
|
||||
for (size_t i = 0; i < 32; i++) {
|
||||
((uint8_t *)send_buffer)[i] = i;
|
||||
((uint8_t *)receive_buffer)[i] = 0;
|
||||
}
|
||||
|
||||
i2c0 = bflb_device_get_by_name("i2c0");
|
||||
|
||||
bflb_i2c_init(i2c0, 400000);
|
||||
bflb_i2c_link_txdma(i2c0, true);
|
||||
bflb_i2c_link_rxdma(i2c0, true);
|
||||
|
||||
- 初始化发送和接收 buffer
|
||||
- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K
|
||||
- ``bflb_i2c_link_txdma(i2c0, true)`` 开启 I2C TX DMA 功能
|
||||
- ``bflb_i2c_link_rxdma(i2c0, true)`` 开启 I2C RX DMA 功能
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Write page 0 */
|
||||
dma0_ch0 = bflb_device_get_by_name("dma0_ch0");
|
||||
|
||||
struct bflb_dma_channel_config_s tx_config;
|
||||
|
||||
tx_config.direction = DMA_MEMORY_TO_PERIPH;
|
||||
tx_config.src_req = DMA_REQUEST_NONE;
|
||||
tx_config.dst_req = DMA_REQUEST_I2C0_TX;
|
||||
tx_config.src_addr_inc = DMA_ADDR_INCREMENT_ENABLE;
|
||||
tx_config.dst_addr_inc = DMA_ADDR_INCREMENT_DISABLE;
|
||||
tx_config.src_burst_count = DMA_BURST_INCR1;
|
||||
tx_config.dst_burst_count = DMA_BURST_INCR1;
|
||||
tx_config.src_width = DMA_DATA_WIDTH_32BIT;
|
||||
tx_config.dst_width = DMA_DATA_WIDTH_32BIT;
|
||||
bflb_dma_channel_init(dma0_ch0, &tx_config);
|
||||
|
||||
bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL);
|
||||
|
||||
- 对于 TX, DMA 的配置如下:传输方向(direction)为内存到外设(MEMORY_TO_PERIPH),源请求(src_req)为内存,目标请求(dst_req)为 DMA_REQUEST_I2C0_TX
|
||||
- 调用 ``bflb_dma_channel_init(dma0_ch0, &tx_config)`` 初始化 DMA
|
||||
- 调用 ``bflb_dma_channel_irq_attach(dma0_ch0, dma0_ch0_isr, NULL)`` 注册 dma 通道 0 中断
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
struct bflb_dma_channel_lli_pool_s tx_llipool[20]; /* max trasnfer size 4064 * 20 */
|
||||
struct bflb_dma_channel_lli_transfer_s tx_transfers[1];
|
||||
tx_transfers[0].src_addr = (uint32_t)send_buffer;
|
||||
tx_transfers[0].dst_addr = (uint32_t)DMA_ADDR_I2C0_TDR;
|
||||
tx_transfers[0].nbytes = 32;
|
||||
bflb_dma_channel_lli_reload(dma0_ch0, tx_llipool, 20, tx_transfers, 1);
|
||||
|
||||
msgs[0].addr = 0x50;
|
||||
msgs[0].flags = I2C_M_NOSTOP;
|
||||
msgs[0].buffer = subaddr;
|
||||
msgs[0].length = 2;
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = I2C_M_DMA;
|
||||
msgs[1].buffer = NULL;
|
||||
msgs[1].length = 32;
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
|
||||
bflb_dma_channel_start(dma0_ch0);
|
||||
|
||||
- 分配二十块 lli 内存池,最多可以传输 4064 * 20 字节
|
||||
- 配置一块内存(tx_transfers)进行传输,源地址(src_addr)为存储发送数据的内存地址(send_buffer),目标地址(dst_addr)为 I2C TX FIFO地址(DMA_ADDR_I2C0_TDR)
|
||||
- 调用 ``bflb_dma_channel_lli_reload(dma0_ch0, tx_llipool, 20, tx_transfers, 1)`` 初始化
|
||||
- 调用 ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 I2C 传输
|
||||
- 调用 ``bflb_dma_channel_start(dma0_ch0)`` 启动 DMA 传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Read page 0 */
|
||||
dma0_ch1 = bflb_device_get_by_name("dma0_ch1");
|
||||
|
||||
struct bflb_dma_channel_config_s rx_config;
|
||||
|
||||
rx_config.direction = DMA_PERIPH_TO_MEMORY;
|
||||
rx_config.src_req = DMA_REQUEST_I2C0_RX;
|
||||
rx_config.dst_req = DMA_REQUEST_NONE;
|
||||
rx_config.src_addr_inc = DMA_ADDR_INCREMENT_DISABLE;
|
||||
rx_config.dst_addr_inc = DMA_ADDR_INCREMENT_ENABLE;
|
||||
rx_config.src_burst_count = DMA_BURST_INCR1;
|
||||
rx_config.dst_burst_count = DMA_BURST_INCR1;
|
||||
rx_config.src_width = DMA_DATA_WIDTH_32BIT;
|
||||
rx_config.dst_width = DMA_DATA_WIDTH_32BIT;
|
||||
bflb_dma_channel_init(dma0_ch1, &rx_config);
|
||||
|
||||
bflb_dma_channel_irq_attach(dma0_ch1, dma0_ch1_isr, NULL);
|
||||
|
||||
- 对于 RX, DMA 的配置如下:传输方向(direction)为外设到内存(PERIPH_TO_MEMORY),源请求(src_req)为 DMA_REQUEST_I2C0_RX ,目标请求(dst_req)为内存
|
||||
- 调用 ``bflb_dma_channel_init(dma0_ch1, &rx_config)`` 初始化 DMA
|
||||
- 调用 ``bflb_dma_channel_irq_attach(dma0_ch1, dma0_ch1_isr, NULL)`` 注册 dma 通道 1 中断
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
struct bflb_dma_channel_lli_pool_s rx_llipool[20];
|
||||
struct bflb_dma_channel_lli_transfer_s rx_transfers[1];
|
||||
rx_transfers[0].src_addr = (uint32_t)DMA_ADDR_I2C0_RDR;
|
||||
rx_transfers[0].dst_addr = (uint32_t)receive_buffer;
|
||||
rx_transfers[0].nbytes = 32;
|
||||
|
||||
bflb_dma_channel_lli_reload(dma0_ch1, rx_llipool, 20, rx_transfers, 1);
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = I2C_M_DMA | I2C_M_READ;
|
||||
msgs[1].buffer = NULL;
|
||||
msgs[1].length = 32;
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
|
||||
bflb_dma_channel_start(dma0_ch1);
|
||||
|
||||
- 分配二十块 lli 内存池,最多可以传输 4064 * 20 字节
|
||||
- 配置一块内存(rx_transfers)进行传输,源地址(src_addr)为 I2C RX FIFO地址(DMA_ADDR_I2C0_RDR),目标地址(dst_addr)为存储接收数据的内存地址(receive_buffer)
|
||||
- 调用 ``bflb_dma_channel_lli_reload(dma0_ch1, rx_llipool, 20, rx_transfers, 1)`` 初始化
|
||||
- 调用 ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 I2C 传输
|
||||
- 调用 ``bflb_dma_channel_start(dma0_ch1)`` 启动 DMA 传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
while (dma_tc_flag1 == 0) {
|
||||
}
|
||||
while ((bflb_i2c_get_intstatus(i2c0) & I2C_INTSTS_END) == 0) {
|
||||
}
|
||||
bflb_i2c_deinit(i2c0);
|
||||
|
||||
- 数据传输完成后,复位 I2C 模块
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Check read data */
|
||||
for (uint8_t i = 0; i < 32; i++) {
|
||||
if (((uint8_t *)send_buffer)[i] != ((uint8_t *)receive_buffer)[i]) {
|
||||
printf("check fail, %d write: %02x, read: %02x\r\n", i, ((uint8_t *)send_buffer)[i], ((uint8_t *)receive_buffer)[i]);
|
||||
}
|
||||
}
|
||||
|
||||
- 检查发送和读取的数据是否一致
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。
|
210
docs/source/samples/peripherals/i2c/i2c_eeprom_interrupt.rst
Normal file
210
docs/source/samples/peripherals/i2c/i2c_eeprom_interrupt.rst
Normal file
|
@ -0,0 +1,210 @@
|
|||
I2C - eeprom_interrupt
|
||||
====================
|
||||
|
||||
本 demo 主要介绍 I2C 使用中断的方式读写 eeprom。
|
||||
|
||||
硬件连接
|
||||
-----------------------------
|
||||
|
||||
本 demo 使用到的 gpio 参考 ``board_i2c0_gpio_init`` ,将 eeprom 模块与开发板连接,具体引脚连接方式如下表(以BL616为例):
|
||||
|
||||
.. table:: 硬件连接
|
||||
:widths: 50, 50
|
||||
:width: 80%
|
||||
:align: center
|
||||
|
||||
+-------------------+------------------+
|
||||
| 开发板 I2C 引脚 | eeprom 模块 |
|
||||
+===================+==================+
|
||||
| SCL(GPIO14) | SCL |
|
||||
+-------------------+------------------+
|
||||
| SDA(GPIO15) | SDA |
|
||||
+-------------------+------------------+
|
||||
| GND | GND |
|
||||
+-------------------+------------------+
|
||||
| VCC | VCC |
|
||||
+-------------------+------------------+
|
||||
|
||||
软件实现
|
||||
-----------------------------
|
||||
|
||||
更详细的代码请参考 **examples/peripherals/i2c/i2c_eeprom_interrupt**
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_init();
|
||||
|
||||
- ``board_init`` 中会开启 I2C IP 时钟,并选择 I2C 时钟源和分频。
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
board_i2c0_gpio_init();
|
||||
|
||||
- 配置相关引脚为 `I2C` 功能
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
i2c0 = bflb_device_get_by_name("i2c0");
|
||||
|
||||
bflb_i2c_init(i2c0, 400000);
|
||||
|
||||
- 获取 `i2c0` 句柄,并初始化 i2c0 频率为 400K
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Set i2c interrupt */
|
||||
bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false);
|
||||
bflb_irq_attach(i2c0->irq_num, i2c_isr, NULL);
|
||||
bflb_irq_enable(i2c0->irq_num);
|
||||
|
||||
- 调用 ``bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false)`` 打开 I2C 中断
|
||||
- 注册 I2C 中断
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
uint8_t write_data[256];
|
||||
uint8_t read_data[256];
|
||||
|
||||
/* Write and read buffer init */
|
||||
for (size_t i = 0; i < 256; i++) {
|
||||
write_data[i] = i;
|
||||
read_data[i] = 0;
|
||||
}
|
||||
|
||||
- 初始化发送和接收 buffer
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Write page 0 */
|
||||
subaddr[1] = EEPROM_SELECT_PAGE0;
|
||||
|
||||
msgs[0].addr = 0x50;
|
||||
msgs[0].flags = I2C_M_NOSTOP;
|
||||
msgs[0].buffer = subaddr;
|
||||
msgs[0].length = 2;
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = 0;
|
||||
msgs[1].buffer = write_data;
|
||||
msgs[1].length = EEPROM_TRANSFER_LENGTH;
|
||||
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
if (txFifoFlag) {
|
||||
printf("TX FIFO Ready interrupt generated\r\n");
|
||||
txFifoFlag = 0;
|
||||
}
|
||||
if (rxFifoFlag) {
|
||||
printf("RX FIFO Ready interrupt generated\r\n");
|
||||
rxFifoFlag = 0;
|
||||
}
|
||||
printf("write over\r\n\r\n");
|
||||
bflb_mtimer_delay_ms(100);
|
||||
|
||||
- ``bflb_i2c_transfer(i2c0, msgs, 2)`` 开启 i2c 传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Unmask interrupt */
|
||||
bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false);
|
||||
|
||||
/* Write page 1 */
|
||||
subaddr[1] = EEPROM_SELECT_PAGE1;
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = 0;
|
||||
msgs[1].buffer = write_data + EEPROM_TRANSFER_LENGTH;
|
||||
msgs[1].length = EEPROM_TRANSFER_LENGTH;
|
||||
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
if (txFifoFlag) {
|
||||
printf("TX FIFO Ready interrupt generated\r\n");
|
||||
txFifoFlag = 0;
|
||||
}
|
||||
if (rxFifoFlag) {
|
||||
printf("RX FIFO Ready interrupt generated\r\n");
|
||||
rxFifoFlag = 0;
|
||||
}
|
||||
printf("write over\r\n\r\n");
|
||||
bflb_mtimer_delay_ms(100);
|
||||
|
||||
- 开启 I2C 中断,进行第二次数据传输
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Unmask interrupt */
|
||||
bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false);
|
||||
|
||||
/* Read page 0 */
|
||||
subaddr[1] = EEPROM_SELECT_PAGE0;
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = I2C_M_READ;
|
||||
msgs[1].buffer = read_data;
|
||||
msgs[1].length = EEPROM_TRANSFER_LENGTH;
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
if (txFifoFlag) {
|
||||
printf("TX FIFO Ready interrupt generated\r\n");
|
||||
txFifoFlag = 0;
|
||||
}
|
||||
if (rxFifoFlag) {
|
||||
printf("RX FIFO Ready interrupt generated\r\n");
|
||||
rxFifoFlag = 0;
|
||||
}
|
||||
printf("read over\r\n\r\n");
|
||||
|
||||
- 读取 eeprom 的数据
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Unmask interrupt */
|
||||
bflb_i2c_int_mask(i2c0, I2C_INTEN_END | I2C_INTEN_TX_FIFO | I2C_INTEN_RX_FIFO | I2C_INTEN_NACK | I2C_INTEN_ARB | I2C_INTEN_FER, false);
|
||||
|
||||
/* Read page 1 */
|
||||
subaddr[1] = EEPROM_SELECT_PAGE1;
|
||||
|
||||
msgs[1].addr = 0x50;
|
||||
msgs[1].flags = I2C_M_READ;
|
||||
msgs[1].buffer = read_data + EEPROM_TRANSFER_LENGTH;
|
||||
msgs[1].length = EEPROM_TRANSFER_LENGTH;
|
||||
bflb_i2c_transfer(i2c0, msgs, 2);
|
||||
if (txFifoFlag) {
|
||||
printf("TX FIFO Ready interrupt generated\r\n");
|
||||
txFifoFlag = 0;
|
||||
}
|
||||
if (rxFifoFlag) {
|
||||
printf("RX FIFO Ready interrupt generated\r\n");
|
||||
rxFifoFlag = 0;
|
||||
}
|
||||
|
||||
- 第二次读取数据
|
||||
|
||||
.. code-block:: C
|
||||
:linenos:
|
||||
|
||||
/* Check read data */
|
||||
for (uint8_t i = 0; i < 2 * EEPROM_TRANSFER_LENGTH; i++) {
|
||||
if (write_data[i] != read_data[i]) {
|
||||
printf("check fail, %d write: %02x, read: %02x\r\n", i, write_data[i], read_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
- 检查发送和读取的数据是否一致
|
||||
|
||||
编译和烧录
|
||||
-----------------------------
|
||||
|
||||
参考 :ref:`linux_cmd` 或者 :ref:`windows_cmd`
|
||||
|
||||
实验现象
|
||||
-----------------------------
|
||||
|
||||
按下 RST 按键,数据传输完成后,打印“write over”,“read over”和“check over”。
|
34
docs/source/samples/peripherals/i2c/index.rst
Normal file
34
docs/source/samples/peripherals/i2c/index.rst
Normal file
|
@ -0,0 +1,34 @@
|
|||
====
|
||||
I2C
|
||||
====
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
I2C - 10-bit <i2c_10_bit>
|
||||
I2C - eeprom <i2c_eeprom>
|
||||
I2C - eeprom_dma <i2c_eeprom_dma>
|
||||
I2C - eeprom_interrupt <i2c_eeprom_interrupt>
|
||||
|
||||
I2C 信号引脚对应的 GPIO 如下表:
|
||||
|
||||
.. table:: GPIO 口
|
||||
:widths: 30, 30, 40
|
||||
:width: 80%
|
||||
:align: center
|
||||
|
||||
+----------+-----------+---------------------------+
|
||||
| 信号 | 芯片系列 | GPIO |
|
||||
+==========+===========+===========================+
|
||||
| SCL | BL702 | |
|
||||
+ +-----------+---------------------------+
|
||||
| | BL808 | |
|
||||
+ +-----------+---------------------------+
|
||||
| | BL616 | GPIO 14 |
|
||||
+----------+-----------+---------------------------+
|
||||
| SDA | BL702 | |
|
||||
+ +-----------+---------------------------+
|
||||
| | BL808 | |
|
||||
+ +-----------+---------------------------+
|
||||
| | BL616 | GPIO 15 |
|
||||
+----------+-----------+---------------------------+
|
Loading…
Add table
Add a link
Reference in a new issue