Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AB32VG1
RT-Thread Studio
学习笔记
AB32VG1系列之IIC
发布于 2021-03-16 19:00:20 浏览:1094
订阅该版
[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 ![image-20210314183245579.png](https://oss-club.rt-thread.org/uploads/20210316/6c48ddae412eb74b7f66bae8c24aa8bd.png) 因为是软件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()`函数没有被声明和实现 ![image-20210314193157116.png](https://oss-club.rt-thread.org/uploads/20210316/ff61f0cacaa187f05945b45277565e9b.png) 因此该函数需要被用户自己声明与实现。那么`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 ## 效果展示 ![image.png](https://oss-club.rt-thread.org/uploads/20210316/4b51cf71cd80e6a516d977721f3b2de9.png)
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
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部