Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AB32VG1
RT-Thread Studio
学习笔记
AB32VG1系列之IIC
发布于 2021-03-16 19:00:20 浏览:1141
订阅该版
[tocm] # IIC > 时间:2021年3月14日18:27:34 > > 作者:JiangYangJie > > 项目地址:https://gitee.com/JiangYangJie/ab32-vg1_-study_-notes ## 0x01:IIC详解 [iic详解](https://gitee.com/JiangYangJie/embedded-learning/blob/master/%E9%80%9A%E4%BF%A1/iic/iic.md) ## 0x02:硬件 本次采用外接0.96寸OLED iic屏幕来测试软件IIC  因为是软件IIC,所以OLED的SDA,SCL随便连IO就行 ## 0x03:软件 oled驱动可以使用自己的,也可以使用官方的。 [使用官方库可看此文章](https://club.rt-thread.org/ask/article/2609.html) [soft-iic 官方例程](https://www.rt-thread.org/document/site/rtthread-studio/drivers/soft-i2c/rtthread-studio-soft-i2c/) 在参照官方例程移植soft - iic时,发现AB32VG1的库函数不全,导致`GET_PIN()`函数没有被声明和实现  因此该函数需要被用户自己声明与实现。那么`GET_PIN()`到底有什么用呢? > `GET_PIN()`函数返回一个uint8_t类型的数据与函数rt_pin_get()的作用一样。但是,在IIC引脚初始化时,调用函数`rt_pin_get()`去获取PIN时,编译器会报“initializer element is not constant" 错误,原因是在编译时,`rt_pin_get()`返回的是一个不确定值,无法初始化IIC的引脚结构体。所以要实现`GET_PIN()`。 如何实现`GET_PIN()`? > 上面说到`rt_pin_get()`几乎等同于`GET_PIN()`,因此,要从`rt_pin_get()`函数下手。本次不将`rt_pin_get()`贴出。经过分析得到其核心函数为`PIN_NUM()`。再将`PIN_NUM()`进行分析,可发现所有引脚都来自于`port_table[]`这个数组。 ```c struct port_info { uint8_t start_pin; // 开始引脚 uint8_t delta_pin; // 引脚数量 uint8_t total_pin; // 总共的引脚 }; static const struct port_info port_table[] = { {0, 8, 0}, /* PA0-PA7 */ {0, 5, 8}, /* PB0-PB5 */ 8 = delta_pin+total_pin = 8+0 {0, 8, 13}, /* PE0-PE7 */ 13 = 5+8 {0, 6, 21}, /* PF0-PF6 */ 21 = 8 + 13 }; #define PIN_NUM(port, no) ((uint8_t)(port_table[port].total_pin + no - port_table[port].start_pin)) ``` ```c // 自己实现GET_PIN() #define __AB32_GET_PIN_A(PIN) PIN #define __AB32_GET_PIN_B(PIN) 8 + PIN #define __AB32_GET_PIN_E(PIN) 13 + PIN #define __AB32_GET_PIN_F(PIN) 21 + PIN #define GET_PIN(PORTx,PIN) (uint8_t)__AB32_GET_PIN_##PORTx(PIN) ``` 已向rt-thread贡献一个PR [[ab32vg1] add GET_PIN(PORTx,PIN)](https://github.com/RT-Thread/rt-thread/pull/4456) ## 0x04:使用 ```c // 1. 先声明一个iic句柄 static struct rt_i2c_bus_device * i2c; // 2. 初始化iic句柄 i2c = (struct rt_i2c_bus_device *)rt_device_find("i2c1"); // 3. iic发送数据 uint8_t buf[2] = {0x00, I2C_Command}; rt_i2c_master_send(i2c, 0x3c, RT_I2C_WR, buf, 2); ``` 具体代码详见gitee ## 效果展示 
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
JiangYangJie
这家伙很懒,什么也没写!
文章
7
回答
0
被采纳
0
关注TA
发私信
相关文章
1
rt_thread studio 啥时候能用呢
2
RT_Thread使用反馈帖子
3
RTT studio 下的 AT指令问题。
4
什么时候RTT Sdudio支持Ubuntu,Deepin和UOS操作系统
5
rt thread Studio 关于J-LINK下载问题
6
RT-Thread studio 调试设置问题
7
RTT-Studio 如何设置调试配置参数?
8
rt_thread studio 软件包配置
9
RT-Studio目前只能开发STM32的项目吗?
10
rtt studio 生成hex名字修改
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
GD32
ADC
flashDB
编译报错
socket
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1520
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
178
次被采纳
crystal266
551
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
5
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部