Browse Source

* [bsp][essemi] Fix a bug of I2C and edit some documents (#6159)

* [bsp][essemi] Fix a bug of I2C and edit some documents
shiwa 3 years ago
parent
commit
81cdeaf902

+ 11 - 7
bsp/essemi/es32f369x/applications/arduino_pinout/README.md

@@ -2,7 +2,7 @@
 
 
 ## 1 RTduino - RT-Thread的Arduino生态兼容层
 ## 1 RTduino - RT-Thread的Arduino生态兼容层
 
 
-ES32F3696已经适配了RTduino,可正常使用全部功能,包含GPIO/PWM及I2C/SPI通信接口。除标准arduino uno的接口外,该开发板还额外添加了4个led和一个方向键对应的GPIO,方便使用。
+ES32F3696已经适配了[RTduino软件包](https://github.com/RTduino/RTduino),可正常使用全部功能,包含GPIO/PWM及I2C/SPI通信接口。除标准arduino uno的接口外,该开发板还额外添加了4个led和一个方向键对应的GPIO,方便使用。更多信息,请参见[RTduino软件包说明文档](https://github.com/RTduino/RTduino)
 
 
 ### 1.1 使用Keil+Env
 ### 1.1 使用Keil+Env
 
 
@@ -128,13 +128,15 @@ ES32-Arduino的SPI总线是spi0总线, `SCK`、`MISO`、`MOSI`引脚是被RT-T
 
 
 2. 第三方arduino库导入测试
 2. 第三方arduino库导入测试
 
 
+   [DFRobot_BMI160](https://github.com/DFRobot/DFRobot_BMI160)
+
    用法:下载完毕后解压放到 packages\RTduino-latest\libraries\user目录下即可
    用法:下载完毕后解压放到 packages\RTduino-latest\libraries\user目录下即可
 
 
    需要修改一处:这个库有一处函数重载歧义,856行需改为Wire.requestFrom(dev->id,(uint8_t)len);
    需要修改一处:这个库有一处函数重载歧义,856行需改为Wire.requestFrom(dev->id,(uint8_t)len);
 
 
    选择BMI160的库DFRobot_BMI160用于测试,用keil编译时存在以下问题:
    选择BMI160的库DFRobot_BMI160用于测试,用keil编译时存在以下问题:
-
-   1. 缺少INT8_C和UINT8_C宏定义,手动添加 
+   
+   1. 缺少INT8_C和UINT8_C宏定义,手动在pins_arduino.h或其他Arduino头文件中添加 
    
    
       ```c
       ```c
       #ifndef INT8_C
       #ifndef INT8_C
@@ -145,16 +147,18 @@ ES32-Arduino的SPI总线是spi0总线, `SCK`、`MISO`、`MOSI`引脚是被RT-T
       #endif
       #endif
       ```
       ```
 
 
-   2. keil的AC5不支持类变量直接初始化,目前版本的AC6编译器会报错,需要修改工程文件,删掉所有的 --cpp11 --c11 --gnu
-
-   解决以上问题后,能成功调用传感器获取加速度和重力等信息
+   2. 编译报错:Data initializer is not allowed
+   
+      如果使用AC5编译器,给arduino_main.cpp和DFRobot_BMI160.cpp添加 --cpp11 --gnu
+   
+      如果使用AC6编译器,修改工程文件,删掉所有的 --cpp11 --c11 --gnu
    
    
    如果用RT-Thread Studio编译,则不存在这些问题,只需修改存在歧义的问题即可直接使用
    如果用RT-Thread Studio编译,则不存在这些问题,只需修改存在歧义的问题即可直接使用
 
 
 ## 6 其他说明
 ## 6 其他说明
 
 
 ### 1.ADC
 ### 1.ADC
-目前ES32的ADC返回的是原始值,需要计算转换为实际的电压值,暂时不支持分辨率调节,会出现警告信息。
+目前ES32的ADC返回的是原始值,需要计算转换为实际的电压值,暂时不支持分辨率调节,会出现警告信息,无视即可
 ### 2.对非数字IO的管脚不要调用pinMode
 ### 2.对非数字IO的管脚不要调用pinMode
 非数字IO的管脚在其他地方已经初始化了,再次调用pinMode会使他变为普通管脚且无法再重新初始化为非数字IO的功能。即对于任意管脚可以调用pinMode使它变为数字IO管脚,但这一过程不可逆,原有的预设功能将会失效
 非数字IO的管脚在其他地方已经初始化了,再次调用pinMode会使他变为普通管脚且无法再重新初始化为非数字IO的功能。即对于任意管脚可以调用pinMode使它变为数字IO管脚,但这一过程不可逆,原有的预设功能将会失效
 ### 3.SPI/I2C/UART使用
 ### 3.SPI/I2C/UART使用

+ 1 - 0
bsp/essemi/es32f369x/applications/arduino_pinout/examples/arduino_examples.cpp

@@ -6,6 +6,7 @@
  * Change Logs:
  * Change Logs:
  * Date           Author       Notes
  * Date           Author       Notes
  * 2021-12-10     Meco Man     first version
  * 2021-12-10     Meco Man     first version
+ * 2022-07-11     shiwa        add examples for es32f3696
  */
  */
 
 
 #include <Arduino.h>
 #include <Arduino.h>

+ 10 - 2
bsp/essemi/es32f369x/drivers/drv_i2c.c

@@ -19,6 +19,7 @@
  * 2019-11-01     wangyq        update libraries
  * 2019-11-01     wangyq        update libraries
  * 2020-01-14     wangyq        the first version
  * 2020-01-14     wangyq        the first version
  * 2021-04-20     liuhy         the second version
  * 2021-04-20     liuhy         the second version
+ * 2022-07-11     shiwa         Support for RT_NO_START/RT_NO_STOP
  */
  */
 
 
 #include <rthw.h>
 #include <rthw.h>
@@ -275,6 +276,10 @@ static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
     for (i = 0; i < num; i++)
     for (i = 0; i < num; i++)
     {
     {
         msg = &msgs[i];
         msg = &msgs[i];
+        if (msg->buf==NULL||msg->len==0)
+        {
+            continue;
+        }
         if (msg->flags & RT_I2C_RD)
         if (msg->flags & RT_I2C_RD)
         {
         {
             if (ald_i2c_master_recv(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT) != 0)
             if (ald_i2c_master_recv(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT) != 0)
@@ -286,7 +291,10 @@ static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
         else
         else
         {
         {
             uint32_t f=((msg->flags&RT_I2C_NO_START)?0x1:0)|((msg->flags&RT_I2C_NO_STOP)?0x2:0);
             uint32_t f=((msg->flags&RT_I2C_NO_START)?0x1:0)|((msg->flags&RT_I2C_NO_STOP)?0x2:0);
-
+            if (I2C_GET_FLAG((i2c_handle_t *)bus->priv, I2C_STAT_BUSY) == RESET)
+            {
+                f=f&(~_I2C_NO_START);
+            }
             if (_i2c_master_send(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT,f) != 0)
             if (_i2c_master_send(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT,f) != 0)
             {
             {
                 LOG_E("i2c bus write failed,i2c bus stop!\n");
                 LOG_E("i2c bus write failed,i2c bus stop!\n");
@@ -298,7 +306,7 @@ static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
     ret = i;
     ret = i;
 
 
 out:
 out:
-    //LOG_E("send stop condition\n");
+    LOG_D("send stop condition\n");
 
 
     return ret;
     return ret;
 }
 }