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…

二十三种设计模式-工厂方法模式

工厂方法模式是一种创建型设计模式&#xff0c;其核心思想是通过定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行&#xff0c;从而使得扩展变得容易&#xff0c;而不需要修改现有的代码&#xff0c;符合开闭原则&…

25上半年软考高级系统分析师易混淆知识点

第1章 系统工程与信息系统基础 易混淆点1&#xff1a;系统工程生命周期与信息系统的生命周期 1、系统工程生命周期阶段 探索性研究→概念阶段→开发阶段→生产阶段→使用阶段→保障阶段→退役阶段 2、信息系统的生命周期 产生阶段→开发阶段&#xff08;单个系统开发&…

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…

Web漏洞之CSRF和SSRF

Web漏洞之CSRF和SSRF CSRF CSRF&#xff08;Cross Site Request Forgery&#xff0c;跨站请求伪造&#xff09;是一种通过利用用户身份认证信息&#xff0c;诱导用户执行非预期请求的攻击方式。 一、基础知识 1. 漏洞原理 CSRF 的核心在于黑客利用用户的身份认证信息&…

【YashanDB知识库】hive初始化崖山报错YAS-04209

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7849008.html?templateId1718516 【问题分类】功能使用 【关键字】hadoop&#xff0c;hive&#xff0c;YAS-02058 【问题描述】hive初始化崖山报错&#xff1a; 0: jdbc:yasdb://192…

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;因此无法显示内容。下面…

Linux内核 -- Netlink多播组消息处理技术

Netlink多播组消息处理技术文档 概述 Netlink是一种用户态与内核态之间通信的机制&#xff0c;支持单播和多播模式。多播组允许多个用户态进程接收同一组的广播消息&#xff0c;广泛应用于网络事件、系统通知等场景。 本文将详细介绍如何在内核态发送多播组消息&#xff0c;…

SQL 基础教程 - SQL SELECT 语句

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

鸿蒙-三角形

Row() {}.leftTriangle(); // 向下 Styles function downTriangle() { .width(0) .height(0) .borderWidth({ left: 20, right: 20, top: 40 }) .borderColor({ left: Color.Transparent, right: Color.Transparent, top: Color.Red }) } // 向上 Styles function upTr…

使用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…

plantuml的picoweb无法渲染分页图表的问题

1. 背景 使用plantuml自带的picoweb在渲染分页图表时&#xff0c;vscode无法换页&#xff0c;但是使用plantuml官网渲染则没问题。查看plantuml官网的picoweb的说明&#xff0c;picoweb只是plantuml服务的最小实现。因此考虑可能是plantuml服务不全导致的上述问题。 2. docke…

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;&…

【翻译】优化加速像素着色器执行的方法

中文翻译 在回复我的 Twitter 私信时,我遇到了一个关于如何提高像素/片段着色器执行速度的问题。这是一个相当广泛的问题,具体取决于每个 GPU/平台和游戏内容的特性,但我在本帖中扩展了我“头脑风暴”式的回答,以便其他人也觉得有用。这不是一份详尽的清单,更像是一个高层…