[bsp][essemi] Adapt es32f369x for RTduino (#6144)
* [bsp][essemi] Adapt es32f369x for RTduino
|
@ -2,10 +2,18 @@ Import('RTT_ROOT')
|
||||||
Import('rtconfig')
|
Import('rtconfig')
|
||||||
from building import *
|
from building import *
|
||||||
|
|
||||||
cwd = os.path.join(str(Dir('#')), 'applications')
|
src = Glob('*.c')
|
||||||
src = Glob('*.c')
|
|
||||||
|
|
||||||
CPPPATH = [cwd, str(Dir('#'))]
|
if GetDepend(['PKG_USING_RTDUINO']) and not GetDepend(['RTDUINO_NO_SETUP_LOOP']):
|
||||||
|
src += ['arduino_main.cpp']
|
||||||
|
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
CPPPATH = [cwd]
|
||||||
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
|
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
|
||||||
|
|
||||||
|
list = os.listdir(cwd)
|
||||||
|
for item in list:
|
||||||
|
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
|
||||||
|
group = group + SConscript(os.path.join(item, 'SConscript'))
|
||||||
|
|
||||||
Return('group')
|
Return('group')
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-12-10 Meco Man first version
|
||||||
|
* 2022-07-07 shiwa Adapt ES32F369x
|
||||||
|
*/
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
/* put your setup code here, to run once: */
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
/* put your main code here, to run repeatedly: */
|
||||||
|
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
|
||||||
|
delay(250);
|
||||||
|
}
|
|
@ -0,0 +1,167 @@
|
||||||
|
# ES32F3696的Arduino生态兼容说明
|
||||||
|
|
||||||
|
## 1 RTduino - RT-Thread的Arduino生态兼容层
|
||||||
|
|
||||||
|
ES32F3696已经适配了RTduino,可正常使用全部功能,包含GPIO/PWM及I2C/SPI通信接口。除标准arduino uno的接口外,该开发板还额外添加了4个led和一个方向键对应的GPIO,方便使用。
|
||||||
|
|
||||||
|
### 1.1 使用Keil+Env
|
||||||
|
|
||||||
|
1. Env 工具下敲入 menuconfig 命令,或者 RT-Thread Studio IDE 下选择 RT-Thread Settings:
|
||||||
|
|
||||||
|
```Kconfig
|
||||||
|
Hardware Drivers Config --->
|
||||||
|
Onboard Peripheral Drivers --->
|
||||||
|
[*] Support Arduino
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 进入RTduino配置,打开需要使用的各项配置 (SPI,I2C,Adafrui等)
|
||||||
|
|
||||||
|
```Kconfig
|
||||||
|
RT-Thread online packages --->
|
||||||
|
system packages --->
|
||||||
|
RTduino: Arduino Ecological Compatibility Layer
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 使用 pkgs --update下载RTduino包
|
||||||
|
4. 使用scons --target=mdk5生成代码
|
||||||
|
|
||||||
|
### 1.2 使用RT-Thread Studio
|
||||||
|
|
||||||
|
1. 选择 文件 -> 导入 -> BSP导入
|
||||||
|
|
||||||
|
![image-20220630160208893](picture/image-20220630160208893.png)
|
||||||
|
|
||||||
|
2. 选择es32f369x的bsp路径,并填写工程名称、芯片名(es32f3696lx)
|
||||||
|
|
||||||
|
![image-20220630160331334](picture/image-20220630160331334.png)
|
||||||
|
|
||||||
|
3. 打开RT-Thread Settings,选择硬件,开启RTduino支持
|
||||||
|
|
||||||
|
![image-20220706134522478](picture/image-20220706134522478.png)
|
||||||
|
|
||||||
|
保存后稍等片刻,等待Studio下载库并完成配置
|
||||||
|
|
||||||
|
* 可能遇到的问题与解决方案
|
||||||
|
|
||||||
|
1. Unknown flag "-T"
|
||||||
|
|
||||||
|
项目->属性->C/C++构建->GNU ARM Cross C++ Linker -> General在右侧添加lds连接脚本`"${workspace_loc:/${ProjName}/drivers/linker_scripts/link.lds}"`(需要先删除原有的再添加)
|
||||||
|
|
||||||
|
![image-20220701145240404](picture/image-20220701145240404.png)
|
||||||
|
|
||||||
|
2. 启动时直接进入Fault
|
||||||
|
|
||||||
|
选择 项目->属性->C/C++构建->GNU ARM Cross C++ Complier-> Miscellaneous ,在Other compiler flags 中添加` -mcpu=cortex-m3 -mthumb`
|
||||||
|
|
||||||
|
![image-20220701145153781](picture/image-20220701145153781.png)
|
||||||
|
|
||||||
|
## 2 Arduino引脚排布
|
||||||
|
|
||||||
|
该BSP遵照Arduino UNO板的引脚排列方式 ,并额外扩展了一些LED和按键
|
||||||
|
|
||||||
|
| Arduino引脚编号 | ES32引脚编号 | 备注 |
|
||||||
|
| --------------- | ------------ | ---------------- |
|
||||||
|
| D0 | PE3 | UART2 RX |
|
||||||
|
| D1 | PE2 | UART2 TX |
|
||||||
|
| D2 | PE4 | 普通IO |
|
||||||
|
| D3 | PA2 | PWM2 通道3 |
|
||||||
|
| D4 | PE5 | 普通IO |
|
||||||
|
| D5 | PA1 | PWM2 通道2 |
|
||||||
|
| D6 | PA0 | PWM2 通道1 |
|
||||||
|
| D7 | PE6 | 普通IO |
|
||||||
|
| D8 | PB8 | 普通IO |
|
||||||
|
| D9 | PB9 | 普通IO |
|
||||||
|
| D10 | PB0 | 普通IO |
|
||||||
|
| D11 | PB5 | SPI1_MOSI/普通IO |
|
||||||
|
| D12 | PB4 | SPI1_MISO/普通IO |
|
||||||
|
| D13 | PD3 | SPI1_SCK/普通IO |
|
||||||
|
| D14 | PB7 | I2C0_SDA |
|
||||||
|
| D15 | PB6 | I2C0_SCL |
|
||||||
|
| D16 | PC8 | LED4 |
|
||||||
|
| D17 | PC12 | LED5 |
|
||||||
|
| D18 | PC7 | LED6 |
|
||||||
|
| D19 | PC6 | LED7 |
|
||||||
|
| D20 | PF1 | KEY_UP |
|
||||||
|
| D21 | PF4 | KEY_DOWN |
|
||||||
|
| D22 | PF6 | KEY_LEFT |
|
||||||
|
| D23 | PF0 | KEY_RIGHT |
|
||||||
|
| D24 | PF7 | KEY_CENTER |
|
||||||
|
| A0 | PC0 | ADC |
|
||||||
|
| A1 | PC1 | ADC |
|
||||||
|
| A2 | PC2 | ADC |
|
||||||
|
| A3 | PC3 | ADC |
|
||||||
|
| A4 | PA4 | ADC |
|
||||||
|
| A5 | PA5 | ADC |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 3 I2C总线
|
||||||
|
|
||||||
|
ES32-Arduino支持的I2C总线是:i2c0。
|
||||||
|
|
||||||
|
I2C的引脚都是被RT-Thread I2C设备框架接管的,不需要直接操控这两个引脚,直接引用`#include <Wire.h>`(Arduino官方I2C头文件)即可使用。或者使用`Adafruit_I2CDevice.h`控制
|
||||||
|
|
||||||
|
## 4 SPI总线
|
||||||
|
|
||||||
|
ES32-Arduino的SPI总线是spi0总线, `SCK`、`MISO`、`MOSI`引脚是被RT-Thread SPI设备框架接管的,不需要直接操控这3个引脚,直接引用`#include <SPI.h>`(Arduino官方SPI头文件)即可使用。按照Arduino的编程标准,用户需要自行控制片选信号。或者使用`Adafruit_SPIDevice.h`控制
|
||||||
|
|
||||||
|
## 5 测试说明
|
||||||
|
|
||||||
|
在applications/arduino_pinout/examples/arduino_examples.cpp文件中,已经根据功能预设了一系列函数用于测试arduino各个功能,可根据测试需要,取消注释对应的宏定义即可启用对应的测试。如果需要测试,请将arduino_examples.cpp文件的内容覆盖到applications/arduino_main.cpp文件中
|
||||||
|
|
||||||
|
1. RTduino各功能测试
|
||||||
|
|
||||||
|
目前支持的测试如下:
|
||||||
|
|
||||||
|
| 宏定义 | 名称 | 描述 |
|
||||||
|
| ---------------------- | ------------------ | ------------------------------------------------------------ |
|
||||||
|
| ARDU_TEST_GPIO | 数字GPIO测试 | 测试数字管脚的输出功能,包括两个管脚输出高/低电平,一个管脚输出一个0.5s周期的方波 |
|
||||||
|
| ARDU_TEST_PWM | 模拟PWM输出测试 | PWM功能输出测试,分别在三个PWM管脚输出不同的三种占空比的方波 |
|
||||||
|
| ARDU_TEST_ADAFRUIT_I2C | AdafruitI2C测试 | 使用AdafruitI2C库发送数据,测试正常可以收到不断发送的"ABtestabtest" |
|
||||||
|
| ARDU_TEST_ADAFRUIT_SPI | AdafruitSPI测试 | 使用AdafruitSPI库发送数据,测试正常可收到不断的"test" |
|
||||||
|
| ARDU_TEST_I2C | I2C测试 | 通过I2C接口发送数据,测试正常可收到不断的"test" |
|
||||||
|
| ARDU_TEST_SPI | SPI测试 | 通过SPI接口发送和接收数据,测试正常可收到不断的"test" |
|
||||||
|
| ARDU_TEST_INT | 中断测试 | 测试外部中断,按下方向键的中键会打印相关信息 |
|
||||||
|
| ARDU_TEST_DIGITAL_READ | 数字读测试 | 不断读取各个方向键的状态,并在按下时输出信息 |
|
||||||
|
| ARDU_TEST_ADC_READ | ADC测试 | 循环读取各个ADC的数据,并通过串口打印 |
|
||||||
|
| ARDU_TEST_BMI160_PKG | 第三方BMI160包测试 | 测试导入的BMI160库是否正常,程序会不断读取传感器数据并通过串口打印 |
|
||||||
|
|
||||||
|
2. 第三方arduino库导入测试
|
||||||
|
|
||||||
|
用法:下载完毕后解压放到 packages\RTduino-latest\libraries\user目录下即可
|
||||||
|
|
||||||
|
需要修改一处:这个库有一处函数重载歧义,856行需改为Wire.requestFrom(dev->id,(uint8_t)len);
|
||||||
|
|
||||||
|
选择BMI160的库DFRobot_BMI160用于测试,用keil编译时存在以下问题:
|
||||||
|
|
||||||
|
1. 缺少INT8_C和UINT8_C宏定义,手动添加
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifndef INT8_C
|
||||||
|
#define INT8_C(x) ((int8_t)x)
|
||||||
|
#endif
|
||||||
|
#ifndef UINT8_C
|
||||||
|
#define UINT8_C(x) ((uint8_t)x)
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
2. keil的AC5不支持类变量直接初始化,目前版本的AC6编译器会报错,需要修改工程文件,删掉所有的 --cpp11 --c11 --gnu
|
||||||
|
|
||||||
|
解决以上问题后,能成功调用传感器获取加速度和重力等信息
|
||||||
|
|
||||||
|
如果用RT-Thread Studio编译,则不存在这些问题,只需修改存在歧义的问题即可直接使用
|
||||||
|
|
||||||
|
## 6 其他说明
|
||||||
|
|
||||||
|
### 1.ADC
|
||||||
|
目前ES32的ADC返回的是原始值,需要计算转换为实际的电压值,暂时不支持分辨率调节,会出现警告信息。
|
||||||
|
### 2.对非数字IO的管脚不要调用pinMode
|
||||||
|
非数字IO的管脚在其他地方已经初始化了,再次调用pinMode会使他变为普通管脚且无法再重新初始化为非数字IO的功能。即对于任意管脚可以调用pinMode使它变为数字IO管脚,但这一过程不可逆,原有的预设功能将会失效
|
||||||
|
### 3.SPI/I2C/UART使用
|
||||||
|
|
||||||
|
默认只开启了spi0、i2c0及uart2(默认控制台串口),如果需要使用其他的spi/i2c/uart可以在配置中启用,并在初始化时指定名称即可。如果想要调整管脚信息,可以使用ESCodeMaker辅助,但要注意打开对应的外设。
|
||||||
|
|
||||||
|
SPI必须先调用begin才能使用其他函数
|
||||||
|
|
||||||
|
### 4.RTduino编译报错 "posix/xxx.h cannot find"
|
||||||
|
如果编译报错为 "posix/xxx.h cannot find",请更新rt-thread到最新版本(从github仓库拉取最新的源码)
|
|
@ -0,0 +1,9 @@
|
||||||
|
from building import *
|
||||||
|
|
||||||
|
cwd = GetCurrentDir()
|
||||||
|
src = Glob('*.c') + Glob('*.cpp')
|
||||||
|
inc = [cwd]
|
||||||
|
|
||||||
|
group = DefineGroup('Arduino', src, depend = ['PKG_USING_RTDUINO'], CPPPATH = inc)
|
||||||
|
|
||||||
|
Return('group')
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-12-10 Meco Man first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <rtthread.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#define ARDU_TEST_GPIO
|
||||||
|
#define ARDU_TEST_PWM
|
||||||
|
//#define ARDU_TEST_ADAFRUIT_I2C
|
||||||
|
//#define ARDU_TEST_ADAFRUIT_SPI
|
||||||
|
//#define ARDU_TEST_SPI
|
||||||
|
//#define ARDU_TEST_I2C
|
||||||
|
#define ARDU_TEST_INT
|
||||||
|
#define ARDU_TEST_DIGITAL_READ
|
||||||
|
//#define ARDU_TEST_ADC_READ
|
||||||
|
//#define ARDU_TEST_BMI160_PKG
|
||||||
|
|
||||||
|
#if defined(ARDU_TEST_ADAFRUIT_I2C) || defined(ARDU_TEST_ADAFRUIT_SPI)
|
||||||
|
#include <Adafruit_BusIO_Register.h>
|
||||||
|
#endif
|
||||||
|
#ifdef ARDU_TEST_ADAFRUIT_I2C
|
||||||
|
#include <Adafruit_I2CDevice.h>
|
||||||
|
Adafruit_I2CDevice i2c_dev(0x2D);
|
||||||
|
Adafruit_BusIO_Register i2c_reg(&i2c_dev, 0x6261, 2, 0, 2);
|
||||||
|
#endif
|
||||||
|
#ifdef ARDU_TEST_ADAFRUIT_SPI
|
||||||
|
#include "Adafruit_SPIDevice.h"
|
||||||
|
Adafruit_SPIDevice spi_dev(D10, 100000);
|
||||||
|
#endif
|
||||||
|
#ifdef ARDU_TEST_BMI160_PKG
|
||||||
|
#include "DFRobot_BMI160.h"
|
||||||
|
DFRobot_BMI160 *bmi160;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static char buf[16] = {"test"};
|
||||||
|
static char buf2[16] = {"AB"};
|
||||||
|
|
||||||
|
void test_int()
|
||||||
|
{
|
||||||
|
Serial.println("Interrupt Triggered\r\n");
|
||||||
|
}
|
||||||
|
void setup(void)
|
||||||
|
{
|
||||||
|
/* put your setup code here, to run once: */
|
||||||
|
//串口
|
||||||
|
Serial.write("Hello from Arduino\r\n");
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_GPIO //数字管脚输出
|
||||||
|
pinMode(D2, OUTPUT);
|
||||||
|
pinMode(D4, OUTPUT);
|
||||||
|
digitalWrite(D4, 1);
|
||||||
|
pinMode(D7, OUTPUT);
|
||||||
|
digitalWrite(D7, 0);
|
||||||
|
pinMode(D18, OUTPUT); //LED6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pinMode(D21, INPUT);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_PWM //测试PWM输出
|
||||||
|
analogWriteFrequency(10);
|
||||||
|
analogWrite(D3, 80);
|
||||||
|
analogWrite(D5, 127);
|
||||||
|
analogWrite(D6, 200);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_ADAFRUIT_I2C //ADAFRUIT I2C
|
||||||
|
i2c_dev.begin();
|
||||||
|
#endif
|
||||||
|
#ifdef ARDU_TEST_ADAFRUIT_SPI //ADAFRUIT SPI
|
||||||
|
spi_dev.begin();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_I2C //I2C
|
||||||
|
Wire.begin();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_SPI //SPI
|
||||||
|
SPI.begin();
|
||||||
|
SPI.beginTransaction(SPISettings(100000, MSBFIRST, SPI_MODE1));
|
||||||
|
pinMode(D10, OUTPUT);
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_INT //中断输入
|
||||||
|
attachInterrupt(digitalPinToInterrupt(D24), test_int, FALLING);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_DIGITAL_READ //数字管脚输入
|
||||||
|
pinMode(D20,INPUT);
|
||||||
|
pinMode(D21,INPUT);
|
||||||
|
pinMode(D22,INPUT);
|
||||||
|
pinMode(D23,INPUT);
|
||||||
|
#endif
|
||||||
|
#ifdef ARDU_TEST_BMI160_PKG
|
||||||
|
bmi160=new DFRobot_BMI160();
|
||||||
|
int result= bmi160->I2cInit();
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
rt_kprintf("BMI160 Init failed.%d\r\n",result);
|
||||||
|
}
|
||||||
|
bmi160->setStepPowerMode(bmi160->stepNormalPowerMode);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop(void)
|
||||||
|
{
|
||||||
|
/* put your main code here, to run repeatedly: */
|
||||||
|
static int count = 0;
|
||||||
|
count++;
|
||||||
|
#ifdef ARDU_TEST_GPIO
|
||||||
|
digitalWrite(D2, 1);
|
||||||
|
digitalWrite(D18, 0);
|
||||||
|
#endif
|
||||||
|
delay(250);
|
||||||
|
#ifdef ARDU_TEST_GPIO
|
||||||
|
digitalWrite(D2, 0);
|
||||||
|
digitalWrite(D18, 1);
|
||||||
|
#endif
|
||||||
|
delay(250);
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_ADC_READ
|
||||||
|
int val = analogRead(A0 + count % 6);
|
||||||
|
rt_kprintf("A%d=%d\r\n", count % 6, val);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_ADAFRUIT_I2C
|
||||||
|
i2c_dev.write((uint8_t *)buf, strlen(buf), true, (uint8_t *)buf2, 2);
|
||||||
|
i2c_reg.write((uint8_t *)buf, 4);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_ADAFRUIT_SPI
|
||||||
|
spi_dev.beginTransactionWithAssertingCS();
|
||||||
|
spi_dev.transfer((uint8_t *)buf, strlen(buf));
|
||||||
|
spi_dev.endTransactionWithDeassertingCS();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_I2C
|
||||||
|
Wire.beginTransmission(0x2D);
|
||||||
|
Wire.write((uint8_t *)buf, strlen(buf));
|
||||||
|
Wire.endTransmission();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_SPI
|
||||||
|
digitalWrite(D10, LOW);
|
||||||
|
SPI.transfer((uint8_t *)buf, 4);
|
||||||
|
digitalWrite(D10, HIGH);
|
||||||
|
buf[4] = 0;
|
||||||
|
Serial.print(buf);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARDU_TEST_DIGITAL_READ
|
||||||
|
if (digitalRead(D20) == LOW) {
|
||||||
|
Serial.println("UP");
|
||||||
|
}
|
||||||
|
if (digitalRead(D21) == LOW) {
|
||||||
|
Serial.println("DOWN");
|
||||||
|
}
|
||||||
|
if (digitalRead(D22) == LOW) {
|
||||||
|
Serial.println("LEFT");
|
||||||
|
}
|
||||||
|
if (digitalRead(D23) == LOW) {
|
||||||
|
Serial.println("RIGHT");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef ARDU_TEST_BMI160_PKG
|
||||||
|
int16_t data[16]={0,0,0};
|
||||||
|
int result=bmi160->getAccelData(data);
|
||||||
|
rt_kprintf("Accel[R=%d]:%d,%d,%d\r\n",result,data[0],data[1],data[2]);
|
||||||
|
result=bmi160->getAccelGyroData(data);
|
||||||
|
rt_kprintf("Gyro [R=%d]:%d,%d,%d\r\n",result,data[0],data[1],data[2]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 38 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 47 KiB |
After Width: | Height: | Size: 17 KiB |
|
@ -0,0 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-12-10 Meco Man first version
|
||||||
|
* 2022-07-07 shiwa Adapt ES32F369x
|
||||||
|
*/
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <board.h>
|
||||||
|
#include "drv_gpio.h"
|
||||||
|
#include "pins_arduino.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
{Arduino Pin, RT-Thread Pin [, Device Name(PWM or ADC), Channel]}
|
||||||
|
[] means optional
|
||||||
|
Digital pins must NOT give the device name and channel.
|
||||||
|
Analog pins MUST give the device name and channel(ADC, PWM or DAC).
|
||||||
|
Arduino Pin must keep in sequence.
|
||||||
|
*/
|
||||||
|
const pin_map_t pin_map_table[]=
|
||||||
|
{
|
||||||
|
{D0/*, GET_PIN(E,3)*/}, /* UART2_RX */
|
||||||
|
{D1/*, GET_PIN(E,2)*/}, /* UART2_TX */
|
||||||
|
{D2, GET_PIN(E,4)}, /* GPIO0 */
|
||||||
|
{D3, GET_PIN(A,2),"pwm2",3}, /* PWM2 GP32C4T0 CH3 */
|
||||||
|
{D4, GET_PIN(E,5)}, /* GPIO1 */
|
||||||
|
{D5, GET_PIN(A,1),"pwm2",2}, /* PWM2 GP32C4T0 CH2 */
|
||||||
|
{D6, GET_PIN(A,0),"pwm2",1}, /* PWM2 GP32C4T0 CH1 */
|
||||||
|
{D7, GET_PIN(E,6)}, /* GPIO2 */
|
||||||
|
|
||||||
|
{D8, GET_PIN(B,8)}, /* GPIO3 */
|
||||||
|
{D9, GET_PIN(B,9)}, /* GPIO4 */
|
||||||
|
{D10, GET_PIN(B,0)}, /* GPIO5 */
|
||||||
|
{D11/*, GET_PIN(B,5)*/}, /* SPI0_MOSI */
|
||||||
|
{D12/*, GET_PIN(B,4)*/}, /* SPI0_MISO */
|
||||||
|
{D13/*, GET_PIN(D,3)*/}, /* SPI0_SCK */
|
||||||
|
|
||||||
|
{D14/*, GET_PIN(B,7)*/}, /* I2C0_SDA */
|
||||||
|
{D15/*, GET_PIN(B,6)*/}, /* I2C0_SCL */
|
||||||
|
|
||||||
|
{D16, GET_PIN(C,8)}, /* LED4 */
|
||||||
|
{D17, GET_PIN(C,12)}, /* LED5 */
|
||||||
|
{D18, GET_PIN(C,7)}, /* LED6 */
|
||||||
|
{D19, GET_PIN(C,6)}, /* LED7 */
|
||||||
|
|
||||||
|
{D20, GET_PIN(F,1)}, /* KEY_UP */
|
||||||
|
{D21, GET_PIN(F,4)}, /* KEY_DOWN */
|
||||||
|
{D22, GET_PIN(F,6)}, /* KEY_LEFT */
|
||||||
|
{D23, GET_PIN(F,0)}, /* KEY_RIGHT */
|
||||||
|
{D24, GET_PIN(F,7)}, /* KEY_CENTER */
|
||||||
|
|
||||||
|
{A0, GET_PIN(C,0),"adc0",0}, /* ADC0 */
|
||||||
|
{A1, GET_PIN(C,1),"adc0",1}, /* ADC0 */
|
||||||
|
{A2, GET_PIN(C,2),"adc0",2}, /* ADC0 */
|
||||||
|
{A3, GET_PIN(C,3),"adc0",3}, /* ADC0 */
|
||||||
|
{A4, GET_PIN(A,4),"adc0",4}, /* ADC0 */
|
||||||
|
{A5, GET_PIN(A,5),"adc0",5}, /* ADC0 */
|
||||||
|
};
|
|
@ -0,0 +1,58 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021-12-10 Meco Man first version
|
||||||
|
* 2022-07-07 shiwa Adapt ES32F369x
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Pins_Arduino_h
|
||||||
|
#define Pins_Arduino_h
|
||||||
|
|
||||||
|
/* pins alias. Must keep in sequence */
|
||||||
|
#define D0 (0)
|
||||||
|
#define D1 (1)
|
||||||
|
#define D2 (2)
|
||||||
|
#define D3 (3)
|
||||||
|
#define D4 (4)
|
||||||
|
#define D5 (5)
|
||||||
|
#define D6 (6)
|
||||||
|
#define D7 (7)
|
||||||
|
|
||||||
|
#define D8 (8)
|
||||||
|
#define D9 (9)
|
||||||
|
#define D10 (10)
|
||||||
|
#define D11 (11)
|
||||||
|
#define D12 (12)
|
||||||
|
#define D13 (13)
|
||||||
|
#define D14 (14)
|
||||||
|
#define D15 (15)
|
||||||
|
#define D16 (16)
|
||||||
|
#define D17 (17)
|
||||||
|
#define D18 (18)
|
||||||
|
#define D19 (19)
|
||||||
|
#define D20 (20)
|
||||||
|
#define D21 (21)
|
||||||
|
#define D22 (22)
|
||||||
|
#define D23 (23)
|
||||||
|
#define D24 (24)
|
||||||
|
|
||||||
|
#define A0 (25)
|
||||||
|
#define A1 (26)
|
||||||
|
#define A2 (27)
|
||||||
|
#define A3 (28)
|
||||||
|
#define A4 (29)
|
||||||
|
#define A5 (30)
|
||||||
|
|
||||||
|
#define F_CPU 96000000L /* CPU: 96MHz */
|
||||||
|
|
||||||
|
#define RTDUINO_DEFAULT_IIC_BUS_NAME "i2c0"
|
||||||
|
|
||||||
|
#define RTDUINO_DEFAULT_SPI_BUS_NAME "spi0"
|
||||||
|
|
||||||
|
#define LED_BUILTIN D16
|
||||||
|
|
||||||
|
#endif /* Pins_Arduino_h */
|
|
@ -1,23 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Change Logs:
|
* Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd.
|
||||||
* Date Author Notes
|
|
||||||
* 2021-04-20 liuhy the first version
|
|
||||||
*
|
|
||||||
* Copyright (C) 2021 Shanghai Eastsoft Microelectronics Co., Ltd. All rights reserved.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the License); you may
|
|
||||||
* not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
|
||||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -39,39 +21,40 @@ struct pin_index
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define ES_GPIO_ADC_CH0_GPIO GPIOC
|
#define ES_GPIO_ADC_CH0_GPIO GPIOC
|
||||||
#define ES_GPIO_ADC_CH1_GPIO GPIOC
|
#define ES_GPIO_ADC_CH0_PIN GPIO_PIN_0
|
||||||
#define ES_GPIO_ADC_CH2_GPIO GPIOC
|
#define ES_GPIO_ADC_CH1_GPIO GPIOC
|
||||||
#define ES_GPIO_ADC_CH3_GPIO GPIOC
|
#define ES_GPIO_ADC_CH1_PIN GPIO_PIN_1
|
||||||
#define ES_GPIO_ADC_CH4_GPIO GPIOA
|
#define ES_GPIO_ADC_CH2_GPIO GPIOC
|
||||||
#define ES_GPIO_ADC_CH5_GPIO GPIOA
|
#define ES_GPIO_ADC_CH2_PIN GPIO_PIN_2
|
||||||
#define ES_GPIO_ADC_CH6_GPIO GPIOA
|
#define ES_GPIO_ADC_CH3_GPIO GPIOC
|
||||||
#define ES_GPIO_ADC_CH7_GPIO GPIOA
|
#define ES_GPIO_ADC_CH3_PIN GPIO_PIN_3
|
||||||
#define ES_GPIO_ADC_CH8_GPIO GPIOA
|
#define ES_GPIO_ADC_CH4_GPIO GPIOA
|
||||||
#define ES_GPIO_ADC_CH9_GPIO GPIOA
|
#define ES_GPIO_ADC_CH4_PIN GPIO_PIN_0
|
||||||
#define ES_GPIO_ADC_CH10_GPIO GPIOA
|
#define ES_GPIO_ADC_CH5_GPIO GPIOA
|
||||||
#define ES_GPIO_ADC_CH11_GPIO GPIOA
|
#define ES_GPIO_ADC_CH5_PIN GPIO_PIN_1
|
||||||
#define ES_GPIO_ADC_CH12_GPIO GPIOC
|
#define ES_GPIO_ADC_CH6_GPIO GPIOA
|
||||||
#define ES_GPIO_ADC_CH13_GPIO GPIOC
|
#define ES_GPIO_ADC_CH6_PIN GPIO_PIN_2
|
||||||
#define ES_GPIO_ADC_CH14_GPIO GPIOB
|
#define ES_GPIO_ADC_CH7_GPIO GPIOA
|
||||||
#define ES_GPIO_ADC_CH15_GPIO GPIOB
|
#define ES_GPIO_ADC_CH7_PIN GPIO_PIN_3
|
||||||
|
#define ES_GPIO_ADC_CH8_GPIO GPIOA
|
||||||
|
#define ES_GPIO_ADC_CH8_PIN GPIO_PIN_4
|
||||||
|
#define ES_GPIO_ADC_CH9_GPIO GPIOA
|
||||||
|
#define ES_GPIO_ADC_CH9_PIN GPIO_PIN_5
|
||||||
|
#define ES_GPIO_ADC_CH10_GPIO GPIOA
|
||||||
|
#define ES_GPIO_ADC_CH10_PIN GPIO_PIN_6
|
||||||
|
#define ES_GPIO_ADC_CH11_GPIO GPIOA
|
||||||
|
#define ES_GPIO_ADC_CH11_PIN GPIO_PIN_7
|
||||||
|
#define ES_GPIO_ADC_CH12_GPIO GPIOC
|
||||||
|
#define ES_GPIO_ADC_CH12_PIN GPIO_PIN_4
|
||||||
|
#define ES_GPIO_ADC_CH13_GPIO GPIOC
|
||||||
|
#define ES_GPIO_ADC_CH13_PIN GPIO_PIN_5
|
||||||
|
#define ES_GPIO_ADC_CH14_GPIO GPIOB
|
||||||
|
#define ES_GPIO_ADC_CH14_PIN GPIO_PIN_0
|
||||||
|
#define ES_GPIO_ADC_CH15_GPIO GPIOB
|
||||||
|
#define ES_GPIO_ADC_CH15_PIN GPIO_PIN_1
|
||||||
|
|
||||||
|
|
||||||
#define ES_GPIO_ADC_CH0_PIN GPIO_PIN_0
|
|
||||||
#define ES_GPIO_ADC_CH1_PIN GPIO_PIN_1
|
|
||||||
#define ES_GPIO_ADC_CH2_PIN GPIO_PIN_2
|
|
||||||
#define ES_GPIO_ADC_CH3_PIN GPIO_PIN_3
|
|
||||||
#define ES_GPIO_ADC_CH4_PIN GPIO_PIN_0
|
|
||||||
#define ES_GPIO_ADC_CH5_PIN GPIO_PIN_1
|
|
||||||
#define ES_GPIO_ADC_CH6_PIN GPIO_PIN_2
|
|
||||||
#define ES_GPIO_ADC_CH7_PIN GPIO_PIN_3
|
|
||||||
#define ES_GPIO_ADC_CH8_PIN GPIO_PIN_4
|
|
||||||
#define ES_GPIO_ADC_CH9_PIN GPIO_PIN_5
|
|
||||||
#define ES_GPIO_ADC_CH10_PIN GPIO_PIN_6
|
|
||||||
#define ES_GPIO_ADC_CH11_PIN GPIO_PIN_7
|
|
||||||
#define ES_GPIO_ADC_CH12_PIN GPIO_PIN_4
|
|
||||||
#define ES_GPIO_ADC_CH13_PIN GPIO_PIN_5
|
|
||||||
#define ES_GPIO_ADC_CH14_PIN GPIO_PIN_0
|
|
||||||
#define ES_GPIO_ADC_CH15_PIN GPIO_PIN_1
|
|
||||||
|
|
||||||
static const struct pin_index pins[] =
|
static const struct pin_index pins[] =
|
||||||
{
|
{
|
||||||
|
@ -264,10 +247,6 @@ static const struct pin_index pins[] =
|
||||||
#define ES_PIN_GPIO_B_9 96
|
#define ES_PIN_GPIO_B_9 96
|
||||||
#define ES_PIN_GPIO_E_0 97
|
#define ES_PIN_GPIO_E_0 97
|
||||||
#define ES_PIN_GPIO_E_1 98
|
#define ES_PIN_GPIO_E_1 98
|
||||||
|
|
||||||
/* UART_TX */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef ES_UART0_TX_GPIO_FUNC
|
#ifndef ES_UART0_TX_GPIO_FUNC
|
||||||
#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3
|
#define ES_UART0_TX_GPIO_FUNC GPIO_FUNC_3
|
||||||
#endif
|
#endif
|
||||||
|
@ -683,24 +662,24 @@ static const struct pin_index pins[] =
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ES_UART2_RX_PIN
|
#ifndef ES_UART2_RX_PIN
|
||||||
#ifdef ES_PIN_GPIO_E_3
|
#ifdef ES_PIN_GPIO_B_4
|
||||||
#define ES_UART2_RX_PIN ES_PIN_GPIO_E_3
|
#define ES_UART2_RX_PIN ES_PIN_GPIO_B_4
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ES_UART2_RX_GPIO_FUNC
|
#ifndef ES_UART2_RX_GPIO_FUNC
|
||||||
#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_5
|
#define ES_UART2_RX_GPIO_FUNC GPIO_FUNC_3
|
||||||
#endif
|
#endif
|
||||||
#ifndef ES_UART2_RX_GPIO_PORT
|
#ifndef ES_UART2_RX_GPIO_PORT
|
||||||
#define ES_UART2_RX_GPIO_PORT GPIOB
|
#define ES_UART2_RX_GPIO_PORT GPIOE
|
||||||
#endif
|
#endif
|
||||||
#ifndef ES_UART2_RX_GPIO_PIN
|
#ifndef ES_UART2_RX_GPIO_PIN
|
||||||
#define ES_UART2_RX_GPIO_PIN GPIO_PIN_4
|
#define ES_UART2_RX_GPIO_PIN GPIO_PIN_3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ES_UART2_RX_PIN
|
#ifndef ES_UART2_RX_PIN
|
||||||
#ifdef ES_PIN_GPIO_B_4
|
#ifdef ES_PIN_GPIO_E_3
|
||||||
#define ES_UART2_RX_PIN ES_PIN_GPIO_B_4
|
#define ES_UART2_RX_PIN ES_PIN_GPIO_E_3
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1758,22 +1737,6 @@ static const struct pin_index pins[] =
|
||||||
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
|
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef ES_SPI0_SCK_PIN
|
|
||||||
#ifdef ES_PIN_GPIO_D_3
|
|
||||||
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_D_3
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ES_SPI0_SCK_GPIO_FUNC
|
|
||||||
#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4
|
|
||||||
#endif
|
|
||||||
#ifndef ES_SPI0_SCK_GPIO_PORT
|
|
||||||
#define ES_SPI0_SCK_GPIO_PORT GPIOB
|
|
||||||
#endif
|
|
||||||
#ifndef ES_SPI0_SCK_GPIO_PIN
|
|
||||||
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef ES_SPI0_SCK_PIN
|
#ifndef ES_SPI0_SCK_PIN
|
||||||
#ifdef ES_PIN_GPIO_B_3
|
#ifdef ES_PIN_GPIO_B_3
|
||||||
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_B_3
|
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_B_3
|
||||||
|
@ -1796,6 +1759,22 @@ static const struct pin_index pins[] =
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef ES_SPI0_SCK_GPIO_FUNC
|
||||||
|
#define ES_SPI0_SCK_GPIO_FUNC GPIO_FUNC_4
|
||||||
|
#endif
|
||||||
|
#ifndef ES_SPI0_SCK_GPIO_PORT
|
||||||
|
#define ES_SPI0_SCK_GPIO_PORT GPIOD
|
||||||
|
#endif
|
||||||
|
#ifndef ES_SPI0_SCK_GPIO_PIN
|
||||||
|
#define ES_SPI0_SCK_GPIO_PIN GPIO_PIN_3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ES_SPI0_SCK_PIN
|
||||||
|
#ifdef ES_PIN_GPIO_D_3
|
||||||
|
#define ES_SPI0_SCK_PIN ES_PIN_GPIO_D_3
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef ES_SPI1_SCK_GPIO_FUNC
|
#ifndef ES_SPI1_SCK_GPIO_FUNC
|
||||||
#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4
|
#define ES_SPI1_SCK_GPIO_FUNC GPIO_FUNC_4
|
||||||
#endif
|
#endif
|
||||||
|
@ -2971,7 +2950,8 @@ static const struct pin_index pins[] =
|
||||||
|
|
||||||
/* GP16C2T_CH2N */
|
/* GP16C2T_CH2N */
|
||||||
|
|
||||||
|
|
||||||
#define ES_RTT_APP_LED_PIN ES_PIN_GPIO_C_6
|
#define ES_RTT_APP_LED_PIN ES_PIN_GPIO_C_6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,12 +7,25 @@ menu "Hardware Drivers Config"
|
||||||
bool "Enable GPIO"
|
bool "Enable GPIO"
|
||||||
select RT_USING_PIN
|
select RT_USING_PIN
|
||||||
default y
|
default y
|
||||||
|
|
||||||
source "drivers/ES/Kconfig"
|
source "drivers/ES/Kconfig"
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Onboard Peripheral Drivers"
|
menu "Onboard Peripheral Drivers"
|
||||||
|
config BSP_USING_ARDUINO
|
||||||
|
bool "Support Arduino"
|
||||||
|
select PKG_USING_RTDUINO
|
||||||
|
select BSP_USING_GPIO
|
||||||
|
select BSP_USING_UART2
|
||||||
|
select BSP_USING_SPI0
|
||||||
|
select BSP_USING_I2C0
|
||||||
|
select BSP_USING_ADC0
|
||||||
|
select BSP_USING_GP32C4T0_PWM
|
||||||
|
imply RTDUINO_USING_SERVO
|
||||||
|
imply RTDUINO_USING_WIRE
|
||||||
|
imply RTDUINO_USING_SPI
|
||||||
|
imply RTDUINO_USING_ADAFRUIT
|
||||||
|
default n
|
||||||
|
|
||||||
config BSP_USING_SPI_FLASH
|
config BSP_USING_SPI_FLASH
|
||||||
bool "Enable SPI FLASH (W25Q64 spi0)"
|
bool "Enable SPI FLASH (W25Q64 spi0)"
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
#include <es32f36xx.h>
|
#include <es32f36xx.h>
|
||||||
#include "es_conf_info_cmu.h"
|
#include "es_conf_info_cmu.h"
|
||||||
|
#include "es_conf_info_gpio.h"
|
||||||
#define ES32F3_SRAM_SIZE 0x18000
|
#define ES32F3_SRAM_SIZE 0x18000
|
||||||
#define ES32F3_SRAM_END (0x20000000 + ES32F3_SRAM_SIZE)
|
#define ES32F3_SRAM_END (0x20000000 + ES32F3_SRAM_SIZE)
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,162 @@ static void _i2c_init(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
#define _I2C_NO_START 0x1
|
||||||
|
#define _I2C_NO_STOP 0x2
|
||||||
|
int _i2c_master_req(i2c_handle_t *hperh, uint16_t dev_addr, uint32_t timeout,uint32_t req_write)
|
||||||
|
{
|
||||||
|
if (hperh->init.addr_mode == I2C_ADDR_7BIT) {
|
||||||
|
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_ADD10_MSK);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_ADD10_MSK);
|
||||||
|
}
|
||||||
|
|
||||||
|
MODIFY_REG(hperh->perh->CON2, I2C_CON2_SADD_MSK, dev_addr << I2C_CON2_SADD_POSS);
|
||||||
|
if (req_write)
|
||||||
|
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_RD_WRN_MSK);
|
||||||
|
else
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_RD_WRN_MSK);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
int _i2c_wait_flag(i2c_handle_t *hperh, uint32_t flag, flag_status_t status, uint32_t timeout)
|
||||||
|
{
|
||||||
|
uint32_t tickstart = 0;
|
||||||
|
|
||||||
|
tickstart = ald_get_tick();
|
||||||
|
while (I2C_GET_FLAG(hperh, flag) == status) {
|
||||||
|
if ((timeout == 0) || ((ald_get_tick() - tickstart ) > timeout)) {
|
||||||
|
hperh->error_code |= I2C_ERROR_TIMEOUT;
|
||||||
|
return TIMEOUT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
int _i2c_wait_txe(i2c_handle_t *hperh, uint32_t timeout)
|
||||||
|
{
|
||||||
|
uint32_t tickstart = ald_get_tick();
|
||||||
|
|
||||||
|
while (I2C_GET_FLAG(hperh, I2C_STAT_THTH) == RESET) {
|
||||||
|
if (I2C_GET_IT_FLAG(hperh, I2C_IT_ARLO)) {
|
||||||
|
hperh->error_code |= I2C_ERROR_ARLO;
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (I2C_GET_IT_FLAG(hperh, I2C_IT_NACK) == SET) {
|
||||||
|
hperh->error_code |= I2C_ERROR_AF;
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((timeout == 0) || ((ald_get_tick() - tickstart) > timeout)) {
|
||||||
|
hperh->error_code |= I2C_ERROR_TIMEOUT;
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
int _i2c_master_send(i2c_handle_t *hperh, uint16_t dev_addr, uint8_t *buf,
|
||||||
|
uint32_t size, uint32_t timeout,uint32_t flag)
|
||||||
|
{
|
||||||
|
if (hperh->state != I2C_STATE_READY)
|
||||||
|
return BUSY;
|
||||||
|
|
||||||
|
if ((buf == NULL) || (size == 0))
|
||||||
|
return ERROR;
|
||||||
|
if ((flag&_I2C_NO_START)==0x0) //NOSTART==0
|
||||||
|
{
|
||||||
|
if (_i2c_wait_flag(hperh, I2C_STAT_BUSY, SET, 100) != OK)
|
||||||
|
return BUSY;
|
||||||
|
_i2c_master_req(hperh, dev_addr, timeout,1);
|
||||||
|
}
|
||||||
|
assert_param(IS_I2C_TYPE(hperh->perh));
|
||||||
|
__LOCK(hperh);
|
||||||
|
|
||||||
|
hperh->state = I2C_STATE_BUSY_TX;
|
||||||
|
hperh->mode = I2C_MODE_MASTER;
|
||||||
|
hperh->error_code = I2C_ERROR_NONE;
|
||||||
|
hperh->p_buff = buf;
|
||||||
|
hperh->xfer_size = size;
|
||||||
|
hperh->xfer_count = 0;
|
||||||
|
|
||||||
|
if ((flag&_I2C_NO_STOP)!=0) //NOSTOP==1
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
|
||||||
|
else
|
||||||
|
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
|
||||||
|
|
||||||
|
if (size <= 0xFF) {
|
||||||
|
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, size << I2C_CON2_NBYTES_POSS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, 0xFF << I2C_CON2_NBYTES_POSS);
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SET_BIT(hperh->perh->FCON, I2C_FCON_TXFRST_MSK);
|
||||||
|
if ((flag&_I2C_NO_START)==0x0) //NOSTART=0
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_START_MSK);
|
||||||
|
|
||||||
|
while (size > 0) {
|
||||||
|
hperh->perh->TXDATA = (*buf++);
|
||||||
|
size--;
|
||||||
|
hperh->xfer_count++;
|
||||||
|
|
||||||
|
if (_i2c_wait_txe(hperh, timeout) != OK)
|
||||||
|
goto ERROR;
|
||||||
|
|
||||||
|
if (((hperh->xfer_count % 0xFF) == 0) && (READ_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK))) {
|
||||||
|
if (_i2c_wait_flag(hperh, I2C_STAT_TCR, RESET, 10) == OK) {
|
||||||
|
if (size > 0xFF) {
|
||||||
|
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, 0xFF << I2C_CON2_NBYTES_POSS);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MODIFY_REG(hperh->perh->CON2, I2C_CON2_NBYTES_MSK, size << I2C_CON2_NBYTES_POSS);
|
||||||
|
if ((flag&_I2C_NO_STOP)==0)
|
||||||
|
CLEAR_BIT(hperh->perh->CON2, I2C_CON2_RELOAD_MSK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (READ_BIT(hperh->perh->CON2, I2C_CON2_AUTOEND_MSK) == SET)
|
||||||
|
goto SUCCESS;
|
||||||
|
|
||||||
|
//NOSTOP==1
|
||||||
|
if ((flag&_I2C_NO_STOP)!=0&&_i2c_wait_flag(hperh, I2C_STAT_TCR, RESET, 10) == OK)
|
||||||
|
{
|
||||||
|
goto SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_i2c_wait_flag(hperh, I2C_STAT_TC, RESET, 10) == OK) {
|
||||||
|
if ((flag&_I2C_NO_STOP)==0x0) //NOSTOP==0
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_STOP_MSK);
|
||||||
|
goto SUCCESS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
goto ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
ERROR:
|
||||||
|
SET_BIT(hperh->perh->CON2, I2C_CON2_STOP_MSK);
|
||||||
|
hperh->state = I2C_STATE_READY;
|
||||||
|
hperh->mode = I2C_MODE_NONE;
|
||||||
|
__UNLOCK(hperh);
|
||||||
|
|
||||||
|
return ERROR;
|
||||||
|
|
||||||
|
SUCCESS:
|
||||||
|
hperh->state = I2C_STATE_READY;
|
||||||
|
hperh->mode = I2C_MODE_NONE;
|
||||||
|
__UNLOCK(hperh);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
|
static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
|
||||||
struct rt_i2c_msg msgs[],
|
struct rt_i2c_msg msgs[],
|
||||||
|
@ -129,7 +285,9 @@ static rt_size_t es32f3_master_xfer(struct rt_i2c_bus_device *bus,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ald_i2c_master_send(bus->priv, msg->addr << 1, msg->buf, msg->len, TIMEOUT) != 0)
|
uint32_t f=((msg->flags&RT_I2C_NO_START)?0x1:0)|((msg->flags&RT_I2C_NO_STOP)?0x2: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");
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -140,7 +298,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_E("send stop condition\n");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
* linker script for ES32F3696LT with GNU ld es32f36xx only change first 9 line
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Program Entry, set to mark it as "used" and avoid gc */
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
ROM (rx) : ORIGIN = 0x00000000, LENGTH = 512k /* 256K flash */
|
||||||
|
RAM (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 32K sram */
|
||||||
|
}
|
||||||
|
ENTRY(Reset_Handler)
|
||||||
|
_system_stack_size = 0x400;
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
_stext = .;
|
||||||
|
KEEP(*(.isr_vector)) /* Startup code */
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
*(.text) /* remaining code */
|
||||||
|
*(.text.*) /* remaining code */
|
||||||
|
*(.rodata) /* read-only data (constants) */
|
||||||
|
*(.rodata*)
|
||||||
|
*(.glue_7)
|
||||||
|
*(.glue_7t)
|
||||||
|
*(.gnu.linkonce.t*)
|
||||||
|
|
||||||
|
/* section information for finsh shell */
|
||||||
|
. = ALIGN(4);
|
||||||
|
__fsymtab_start = .;
|
||||||
|
KEEP(*(FSymTab))
|
||||||
|
__fsymtab_end = .;
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
__vsymtab_start = .;
|
||||||
|
KEEP(*(VSymTab))
|
||||||
|
__vsymtab_end = .;
|
||||||
|
|
||||||
|
/* section information for utest */
|
||||||
|
. = ALIGN(4);
|
||||||
|
__rt_utest_tc_tab_start = .;
|
||||||
|
KEEP(*(UtestTcTab))
|
||||||
|
__rt_utest_tc_tab_end = .;
|
||||||
|
|
||||||
|
/* section information for at server */
|
||||||
|
. = ALIGN(4);
|
||||||
|
__rtatcmdtab_start = .;
|
||||||
|
KEEP(*(RtAtCmdTab))
|
||||||
|
__rtatcmdtab_end = .;
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
/* section information for initial. */
|
||||||
|
. = ALIGN(4);
|
||||||
|
__rt_init_start = .;
|
||||||
|
KEEP(*(SORT(.rti_fn*)))
|
||||||
|
__rt_init_end = .;
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
PROVIDE(__ctors_start__ = .);
|
||||||
|
KEEP (*(SORT(.init_array.*)))
|
||||||
|
KEEP (*(.init_array))
|
||||||
|
PROVIDE(__ctors_end__ = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
_etext = .;
|
||||||
|
} > ROM = 0
|
||||||
|
|
||||||
|
/* .ARM.exidx is sorted, so has to go in its own output section. */
|
||||||
|
__exidx_start = .;
|
||||||
|
.ARM.exidx :
|
||||||
|
{
|
||||||
|
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||||
|
|
||||||
|
/* This is used by the startup in order to initialize the .data secion */
|
||||||
|
_sidata = .;
|
||||||
|
} > ROM
|
||||||
|
__exidx_end = .;
|
||||||
|
|
||||||
|
/* .data section which is used for initialized data */
|
||||||
|
|
||||||
|
.data : AT (_sidata)
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* This is used by the startup in order to initialize the .data secion */
|
||||||
|
_sdata = . ;
|
||||||
|
|
||||||
|
*(.data)
|
||||||
|
*(.data.*)
|
||||||
|
*(.gnu.linkonce.d*)
|
||||||
|
|
||||||
|
|
||||||
|
PROVIDE(__dtors_start__ = .);
|
||||||
|
KEEP(*(SORT(.dtors.*)))
|
||||||
|
KEEP(*(.dtors))
|
||||||
|
PROVIDE(__dtors_end__ = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* This is used by the startup in order to initialize the .data secion */
|
||||||
|
_edata = . ;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
.stack :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
_sstack = .;
|
||||||
|
. = . + _system_stack_size;
|
||||||
|
. = ALIGN(4);
|
||||||
|
_estack = .;
|
||||||
|
} >RAM
|
||||||
|
|
||||||
|
__bss_start = .;
|
||||||
|
.bss :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* This is used by the startup in order to initialize the .bss secion */
|
||||||
|
_sbss = .;
|
||||||
|
|
||||||
|
*(.bss)
|
||||||
|
*(.bss.*)
|
||||||
|
*(COMMON)
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
/* This is used by the startup in order to initialize the .bss secion */
|
||||||
|
_ebss = . ;
|
||||||
|
|
||||||
|
*(.bss.init)
|
||||||
|
} > RAM
|
||||||
|
__bss_end = .;
|
||||||
|
|
||||||
|
_end = .;
|
||||||
|
|
||||||
|
/* Stabs debugging sections. */
|
||||||
|
.stab 0 : { *(.stab) }
|
||||||
|
.stabstr 0 : { *(.stabstr) }
|
||||||
|
.stab.excl 0 : { *(.stab.excl) }
|
||||||
|
.stab.exclstr 0 : { *(.stab.exclstr) }
|
||||||
|
.stab.index 0 : { *(.stab.index) }
|
||||||
|
.stab.indexstr 0 : { *(.stab.indexstr) }
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
/* DWARF debug sections.
|
||||||
|
* Symbols in the DWARF debugging sections are relative to the beginning
|
||||||
|
* of the section so we begin them at 0. */
|
||||||
|
/* DWARF 1 */
|
||||||
|
.debug 0 : { *(.debug) }
|
||||||
|
.line 0 : { *(.line) }
|
||||||
|
/* GNU DWARF 1 extensions */
|
||||||
|
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||||
|
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||||
|
/* DWARF 1.1 and DWARF 2 */
|
||||||
|
.debug_aranges 0 : { *(.debug_aranges) }
|
||||||
|
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||||
|
/* DWARF 2 */
|
||||||
|
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
|
||||||
|
.debug_abbrev 0 : { *(.debug_abbrev) }
|
||||||
|
.debug_line 0 : { *(.debug_line) }
|
||||||
|
.debug_frame 0 : { *(.debug_frame) }
|
||||||
|
.debug_str 0 : { *(.debug_str) }
|
||||||
|
.debug_loc 0 : { *(.debug_loc) }
|
||||||
|
.debug_macinfo 0 : { *(.debug_macinfo) }
|
||||||
|
/* SGI/MIPS DWARF 2 extensions */
|
||||||
|
.debug_weaknames 0 : { *(.debug_weaknames) }
|
||||||
|
.debug_funcnames 0 : { *(.debug_funcnames) }
|
||||||
|
.debug_typenames 0 : { *(.debug_typenames) }
|
||||||
|
.debug_varnames 0 : { *(.debug_varnames) }
|
||||||
|
}
|