RP2040 C SDK I2C外设使用

RP2040 C SDK I2C外设使用


  • 📌相关篇《RP2040 VSCode C/C++开发环境快速部署》
  • 📍I2C API 外设:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_i2c
  • 🔧驱动I2C ssd1306 屏幕需要使用到的库: https://github.com/daschr/pico-ssd1306

RP2040有2 个硬件 I2C 控制器。

📗利用I2C扫描I2C设备地址

/*CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program RP2040_I2C_SCAN.elf verify reset exit"jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_I2C_SCAN.elf verify reset exit"*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/i2c.h"// 板载LED连接的GPIO引脚
#define LED_PIN 25
// I2C defines
// This example will use I2C0 on GPIO4 (SDA) and GPIO5 (SCL) running at 400KHz.
// Pins can be changed, see the GPIO function select table in the datasheet for information on GPIO assignments
#define I2C_PORT i2c0
#define I2C_SDA_PIN 4
#define I2C_SCL_PIN 5void i2c_setup() {// I2C Initialisation. Using it at 400Khz.i2c_init(I2C_PORT, 400 * 1000);gpio_set_function(I2C_SDA_PIN, GPIO_FUNC_I2C);gpio_set_function(I2C_SCL_PIN, GPIO_FUNC_I2C);gpio_pull_up(I2C_SDA_PIN);//开启内部上拉gpio_pull_up(I2C_SCL_PIN);// Make the I2C pins available to picotoolbi_decl(bi_2pins_with_func(I2C_SDA_PIN, I2C_SCL_PIN, GPIO_FUNC_I2C));
}void scan_i2c_addresses() {for (uint8_t addr = 0x03; addr <= 0x7f; addr++) {uint8_t data = 0x00;int result = i2c_write_blocking(I2C_PORT, addr, &data, 1, false);if (result == 1) {printf("I2C device found at address 0x%02X\n", addr);}}
}int main()
{stdio_init_all();// 设置LED_PIN为输出模式gpio_init(LED_PIN);gpio_set_dir(LED_PIN, GPIO_OUT);// 初始化I2Ci2c_setup();scan_i2c_addresses();while (1) {tight_loop_contents();// 翻转LED状态gpio_put(LED_PIN,!gpio_get(LED_PIN));// 等待0.5秒sleep_ms(3500);scan_i2c_addresses();}return 0;
}

📘SSD1306 oled屏幕驱动显示

配合上面的库实现,很容易点亮屏幕。

  • 调用库需要在项目的CMakeLists.txt中添加对应的源文件。推荐拷贝到项目文件夹内,这样就免去路径。
add_executable(RP2040_I2C_SSD1306 RP2040_I2C_SSD1306.cssd1306.c)
  • 测试demo
/*CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program RP2040_I2C_SSD1306.elf verify reset exit"jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_I2C_SSD1306.elf verify reset exit"*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/i2c.h"#include "ssd1306.h" // Include the SSD1306 library
#include "acme_5_outlines_font.h"
// I2C defines
// This example will use I2C0 on GPIO8 (SDA) and GPIO9 (SCL) running at 400KHz.
// Pins can be changed, see the GPIO function select table in the datasheet for information on GPIO assignments
#define I2C_PORT i2c0
#define I2C_SDA_PIN 4
#define I2C_SCL_PIN 5const uint8_t num_chars_per_disp[]={7,7,7,5};
//const uint8_t *fonts[4]= {acme_font, bubblesstandard_font, crackers_font, BMSPA_font};
//const uint8_t *fonts[1]= {font_8x5};
// 板载LED连接的GPIO引脚
#define LED_PIN 25
#define SLEEPTIME 25/*** @brief 初始化I2C接口** 该函数用于初始化I2C接口,设置I2C的时钟频率为400KHz,* 并将I2C的SDA和SCL引脚设置为I2C功能,同时启用上拉电阻。** @param 无* @return 无*/
void i2c_setup() {// 初始化I2C接口,设置I2C的时钟频率为400KHzi2c_init(I2C_PORT, 400 * 1000);// 将I2C的SDA引脚设置为I2C功能gpio_set_function(I2C_SDA_PIN, GPIO_FUNC_I2C);// 将I2C的SCL引脚设置为I2C功能gpio_set_function(I2C_SCL_PIN, GPIO_FUNC_I2C);// 启用I2C的SDA引脚的上拉电阻gpio_pull_up(I2C_SDA_PIN);// 启用I2C的SCL引脚的上拉电阻gpio_pull_up(I2C_SCL_PIN);// Make the I2C pins available to picotoolbi_decl(bi_2pins_with_func(I2C_SDA_PIN, I2C_SCL_PIN, GPIO_FUNC_I2C));//需要包含binary_info.h头文件
}void animation(void) {const char *words[]= {"SSD1306", "DISPLAY", "DRIVER"};ssd1306_t disp;disp.external_vcc=false;ssd1306_init(&disp, 128, 64, 0x3C, i2c0);ssd1306_clear(&disp);printf("ANIMATION!\n");char buf[8];for(;;) {for(int y=0; y<31; ++y) {ssd1306_draw_line(&disp, 0, y, 127, y);ssd1306_show(&disp);sleep_ms(SLEEPTIME);ssd1306_clear(&disp);}for(int y=0, i=1; y>=0; y+=i) {ssd1306_draw_line(&disp, 0, 31-y, 127, 31+y);ssd1306_draw_line(&disp, 0, 31+y, 127, 31-y);ssd1306_show(&disp);sleep_ms(SLEEPTIME);ssd1306_clear(&disp);if(y==32) i=-1;}for(int i=0; i<sizeof(words)/sizeof(char *); ++i) {ssd1306_draw_string(&disp, 8, 24, 2, words[i]);ssd1306_show(&disp);sleep_ms(800);ssd1306_clear(&disp);}for(int y=31; y<63; ++y) {ssd1306_draw_line(&disp, 0, y, 127, y);ssd1306_show(&disp);sleep_ms(SLEEPTIME);ssd1306_clear(&disp);}//  ssd1306_draw_string_with_font(&disp, 8, 24, 2, font_8x5, buf);ssd1306_draw_string_with_font(&disp, 8, 24, 2, acme_font, (char*)"Hello!");ssd1306_draw_string(&disp, 8, 0, 1, "Perseverance51");ssd1306_show(&disp);sleep_ms(800);ssd1306_clear(&disp);gpio_put(LED_PIN,!gpio_get(LED_PIN));sleep_ms(2000);}
}int main()
{stdio_init_all();gpio_init(LED_PIN);gpio_set_dir(LED_PIN, GPIO_OUT);i2c_setup();
while (1) {//       tight_loop_contents()animation();}return 0;
}

📒利用I2C读写AT24C02数据操作

  • AT24C02是一个只有256字节的存储器。
/*CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program RP2040_I2C_AT24C02.elf verify reset exit"jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_I2C_AT24C02.elf verify reset exit"*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/i2c.h"
#include "pico/binary_info.h"// 板载LED连接的GPIO引脚
#define LED_PIN 25
// I2C defines
// This example will use I2C0 on GPIO4 (SDA) and GPIO5 (SCL) running at 400KHz.
// Pins can be changed, see the GPIO function select table in the datasheet for information on GPIO assignments
#define I2C_PORT i2c0
#define I2C_SDA_PIN 4
#define I2C_SCL_PIN 5#define AT24C02_ADDR 0x50   // AT24C02的地址void i2c_setup() {// I2C Initialisation. Using it at 100Khz.i2c_init(I2C_PORT, 100 * 1000);gpio_set_function(I2C_SDA_PIN, GPIO_FUNC_I2C);gpio_set_function(I2C_SCL_PIN, GPIO_FUNC_I2C);gpio_pull_up(I2C_SDA_PIN);//开启内部上拉gpio_pull_up(I2C_SCL_PIN);// Make the I2C pins available to picotoolbi_decl(bi_2pins_with_func(I2C_SDA_PIN, I2C_SCL_PIN, GPIO_FUNC_I2C));
}void scan_i2c_addresses() {for (uint8_t addr = 0x03; addr <= 0x7f; addr++) {uint8_t data = 0x00;int result = i2c_write_blocking(I2C_PORT, addr, &data, 1, false);if (result == 1) {printf("I2C device found at address 0x%02X\n", addr);}}
}// 向AT24C02写入一个字节
void at24c02_write_byte(uint8_t addr, uint8_t data) {uint8_t buffer[2];buffer[0] = addr;buffer[1] = data;i2c_write_blocking(I2C_PORT, AT24C02_ADDR, buffer, 2, false);sleep_ms(5); // AT24C02写入需要一定时间,这里简单延时等待
}// 从AT24C02读取一个字节
uint8_t at24c02_read_byte(uint8_t addr) {i2c_write_blocking(I2C_PORT, AT24C02_ADDR, &addr,1, true);uint8_t data;i2c_read_blocking(I2C_PORT, AT24C02_ADDR, &data, 1, false);return data;
}// 从AT24C02读取指定长度的数据
void at24c02_read(uint8_t addr, uint8_t *data, size_t length) {i2c_write_blocking(I2C_PORT, AT24C02_ADDR, &addr, 1, true);i2c_read_blocking(I2C_PORT, AT24C02_ADDR, data, length, false);
}int main()
{uint8_t EP_data[35];stdio_init_all();i2c_setup();gpio_init(LED_PIN);gpio_set_dir(LED_PIN, GPIO_OUT);scan_i2c_addresses();at24c02_write_byte(255, 'A');while (1) {// tight_loop_contents();// 翻转LED状态gpio_put(LED_PIN,!gpio_get(LED_PIN));// 读取AT24C02的状态uint8_t data = at24c02_read_byte(255);printf("AT24C02 Address 255 data: %c\n", data);at24c02_read(0, EP_data, 35);printf("EP_data: %s\n", EP_data);sleep_ms(1000);}//  puts("Hello, world!");return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模仿微信小程序wx.showModal自定义弹窗,内容可以修改

实现以下弹框样式功能 1.在components新建一个文件showModel.wpy作为组件&#xff0c;复制下面代码 <style lang"less" scoped> .bg_model {display: flex;justify-content: center;align-items: center;// 弹框背景.bg_hui {width: 100%;height: 100%;posi…

WebP Vs. PNG:哪种图像格式适合您的网站?

图像对任何网站都至关重要,可以增强视觉吸引力和用户体验。但是,图像也会显着影响网站的加载时间,因此必须针对 Web 使用对其进行优化。一种方法是使用正确的图像格式。

mysql乱码、mysql数据中文问号

网上排出此错误方法的很多&#xff0c;但是 都不简洁&#xff0c;找不到根本原因 主要排查两点&#xff1a; 1.代码中jdbc链接的编码规则 urljdbc:mysql://localhost:3306/title?useUnicodetrue&amp;characterEncodingutf8 将characterEncoding设置为utf8 2.设置mysq…

INT303 Big Data Analytics 笔记

Lecture1 Introduction 不考&#xff01; “Data Mining is the study of collecting, processing, analyzing, and gaining useful insights from data” EXPLORATORY ANALYSIS Make measurements to understand what the data looks like first steps when collecting da…

Unity3D仿星露谷物语开发12之创建道具列表

1、目标 道具是游戏的核心部分&#xff0c;道具包括你可以拾取的东西&#xff0c;你可以使用的工具和你能种的东西等。 本节就是创建道具的信息类。同时了解ScriptableObject类的使用。 2、创建道具枚举类 修改Assets -> Scripts -> Enums.cs脚本&#xff0c; 新增如…

如何修复 WordPress 中的“Error establishing a database connection”问题

如何修复 WordPress 中的“Error establishing a database connection”问题 在使用 WordPress 建站时&#xff0c;如果你看到“Error establishing a database connection”的提示&#xff0c;不要慌张。这通常意味着网站无法连接到数据库&#xff0c;因此无法显示内容。下面…

SQL 基础教程 - SQL SELECT 语句

SQL SELECT DISTINCT 语句 SELECT DISTINCT 语句用于返回唯一不同的值。 在表中&#xff0c;一个列可能会包含多个重复值&#xff0c;有时您也许希望仅仅列出不同&#xff08;distinct&#xff09;的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法 …

使用Anaconda管理R语言环境,并使用Jupyter Notebook编写R语言

文章目录 Anaconda中创建R环境0 官方教程存在的问题1 创建R语言环境2 安装常用包集合&#xff1a;r-essentials3 用VS Code的Jupyter插件写R 相信一直使用Python搞数据分析、机器学习的同学们会习惯使用 Anaconda管理不同的Python环境&#xff0c;并使用Jupyter Notebook&#…

3.5mm耳机接口硬件连接

结构 以最复杂的结构为例 简单的结构无非就是没有MIC&#xff08;麦克风&#xff09;接口 上图的5就是Detect的作用 上面这两款产品都为3.5mm的音频插座&#xff0c;图一 为连接4节的音频座&#xff0c;而且有两个开关&#xff0c;1接地&#xff0c;2接MIC&#xff0c;3接左声…

第25天:信息收集-项目系统一键打点资产侦察企查产权空间引擎风险监测利器部署

#知识点 1、信息收集-项目推荐-自动化环境部署 2、信息收集-项目推荐-自动化资产收集管理 一、自动化-网络空间-Yakit&TscanPlus 项目地址&#xff1a;https://www.yaklang.com/ 项目地址&#xff1a;https://github.com/TideSec/TscanPlus 集成Fofa、Hunter、Quake、Zoome…

vue3学习笔记(11)-组件通信

1.props 父传子 子传夫 父传子 接收用defineProps([]) 空字符串也是假 2.自定义事件 $event:事件对象 ref定义的数据在模板里面引用的时候可以不用.value 3.子传父 宏函数 触发事件 声明事件 defineEmits() 挂载之后3s钟触发 4.命名 肉串命名 5.任意组件通信 mitt pubs…

1 数据库(下):多表设计 、多表查询 + SQL中的with查询语法(MySQL8.0以后版本才支持这种新语法)+ 数据库优化(索引优化)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、多表设计1 多表设计-概述2 三种多表关系一对多&#xff08;多对一&#xff09;&#xff08;1&#xff09;无外键约束&#xff08;逻辑外键&#xff09;&…

Supermap iClient Webgl 粒子特效案例-消防场景

作者&#xff1a;Lzzzz 前言 WebGL 粒子特效的应用场景非常广泛&#xff0c;几乎可以在任何需要丰富视觉效果或动态表现的地方看到其身影。通过灵活运用颗粒系统&#xff0c;开发者可以创造出引人入胜的用户体验和视觉表现。 一、效果展示 二、实现步骤 1&#xff0c;构建…

Eclipse常用快捷键详解

文章目录 Eclipse常用快捷键详解一、引言二、编辑快捷键三、选择和移动快捷键四、行操作快捷键五、搜索和导航快捷键六、调试快捷键七、重构快捷键八、其他快捷键九、使用案例场景一&#xff1a;代码编写代码示例 场景二&#xff1a;代码调试场景三&#xff1a;代码重构代码示例…

【MATLAB】股票(和指数)数据下载--雅虎财经

文章目录 一、构建请求二、响应解读及整理2.1 响应2.2 数据提取和保存 三、通用函数3.1 函数3.2 调用示例 四、雅虎财经股票、指数代码4.1 指数4.2 股票 五、GUI界面、可执行程序 雅虎2021年就退出中国了&#xff0c;你懂的。 能下载股票等数据的财经网站、软件也很多。我写着玩…

Unity 使用UGUI制作卷轴开启关闭效果

视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …

Bash 脚本教程

注&#xff1a;本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程&#xff0c;非常不错&#xff0c;至少没接触过 BASH 的也能看懂&#xff01; 建立一个脚本 Linux 中有…

NPM组件包 vant部分版本内嵌挖矿代码

Vant 是一个轻量、可定制的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 Vant 2 版本&#xff1a;https://vant-ui.github.io/vant/v2/#/zh-CN/home V…

在基于Centos7的服务器上启用【Gateway】的【Clion Nova】(即 ReSharper C++ 引擎)

1. 检查启动报错日志&#xff0c;目录在 ~/.cache/JetBrains/CLion202x.x.x/log/backend.202x-xx-xx_xxxx.xxxx-err.log 2. 大致可能有两种报错 a. Process terminated. Couldnt find a valid ICU package installed on the system. 这个报错只需要装一下 libicu-devel 包即可…

Spring-Mybatis 2.0

前言&#xff1a; 第一点&#xff1a;过于依赖代码生成器或AI&#xff0c;导致基于mybaits的CRUD通通忘了&#xff0c;所以为了找回遗忘的记忆&#xff0c;有了该系列内容。 第二点&#xff1a;通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能…