ZYNQ7020使用IIC协议读写IO扩展芯片PCF8575

IO扩展是个好东西, 占用资源少. 适合用在响应要求不高的场合.
PCF8575最大的好处是有个中断反馈引脚, 方便读取状态.
下面直接上代码.
Vivado中的配置.
在这里插入图片描述
XDC文件的配置

set_property -dict {PACKAGE_PIN L14 IOSTANDARD LVCMOS33} [get_ports IIC_0_scl_io]
set_property -dict {PACKAGE_PIN L16 IOSTANDARD LVCMOS33} [get_ports IIC_0_sda_io]
set_property PULLUP true [get_ports IIC_0_scl_io]
set_property PULLUP true [get_ports IIC_0_sda_io]

SDK中的代码.

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
//#include "sleep.h"
#include "xparameters.h" // 包含设备参数信息
#include "xuartps.h"     // 包含UART PS的函数声明
#include "xiicps.h"#include "xil_io.h"///SLCR寄存器,绝对地址,
#define SLCR_UNLOCK_ADDR        0xF8000008
#define SLCR_LOCK_ADDR            0xF8000004//FPGA_RST_CTRL寄存器,绝对地址,#define FPGA_RST_CTRL          0xF8000240
#define UNLOCK_KEY          0xDF0D  //解锁码
#define LOCK_KEY            0x767B  //加锁码#define PL_RST_MASK            0x01//低四位对应FCLK_RESETN[3:0]
#define PL_CLR_MASK            0x00void PlSoftwareReset(void)
{Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY);  //解锁Xil_Out32(FPGA_RST_CTRL, PL_RST_MASK);  //复位Xil_Out32(FPGA_RST_CTRL, PL_CLR_MASK);  //拉起复位Xil_Out32(SLCR_LOCK_ADDR, LOCK_KEY);  //加锁
} 
// PlSoftwareReset 原文链接:https://blog.csdn.net/qq_21531457/article/details/124581055XUartPs debug_uart; // UART实例int debug_init(void) {int Status;XUartPs_Config *Config;//默认使用uart0 如果要用uart1 请改成 XPAR_XUARTPS_1_DEVICE_IDConfig = XUartPs_LookupConfig(XPAR_XUARTPS_0_DEVICE_ID);if (NULL == Config) {return XST_FAILURE;}Status = XUartPs_CfgInitialize(&debug_uart, Config, Config->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}XUartPs_SetBaudRate(&debug_uart, 115200);return XST_SUCCESS;
}#define IIC_DEVICE_ID		XPAR_XIICPS_0_DEVICE_ID
#define TEST_BUFFER_SIZE	512#define IIC_SCLK_RATE		200000u8 SendBuffer[2];    /**< Buffer for Transmitting Data */
u8 RecvBuffer[2];    /**< Buffer for Receiving Data */XIicPs Iic;u8 IIC_SLAVE_ADDR=	0x20; //PCF8575 的IC芯片地址, A0,A1,A2地址均连接到了低电平时的地址.int Status;
void iic_init(void ){XIicPs_Config *Config;int Index;/** Initialize the IIC driver so that it's ready to use* Look up the configuration in the config table,* then initialize it.*/Config = XIicPs_LookupConfig(IIC_DEVICE_ID);if (NULL == Config) {return XST_FAILURE;}Status = XIicPs_CfgInitialize(&Iic, Config, Config->BaseAddress);if (Status != XST_SUCCESS) {return XST_FAILURE;}/** Perform a self-test to ensure that the hardware was built correctly.*/Status = XIicPs_SelfTest(&Iic);if (Status != XST_SUCCESS) {return XST_FAILURE;}/** Set the IIC serial clock rate.*/XIicPs_SetSClk(&Iic, IIC_SCLK_RATE);/** Send the buffer using the IIC and ignore the number of bytes sent* as the return value since we are using it in interrupt mode.*/}int main()
{PlSoftwareReset();//重启FPGA的PL部分,debug的时候不需要每次 烧录FPGA了.init_platform();debug_init();iic_init();while(1){xil_printf("Hello\n");SendBuffer[0] = 0x0;//P0.0 到P0.7引脚置低SendBuffer[1] = 0x0;//P1.0 到P1.7引脚置低//写入IO口数据Status = XIicPs_MasterSendPolled(&Iic, SendBuffer, 2, IIC_SLAVE_ADDR);usleep(100);SendBuffer[0] = 0x02;//P0.0 和P0.1引脚置高SendBuffer[1] = 0x02;//P1.0 和P1.1引脚置高//读取IO口数据Status = XIicPs_MasterSendPolled(&Iic, SendBuffer, 2, IIC_SLAVE_ADDR);usleep(100);//读取引脚状态.Status = XIicPs_MasterRecvPolled(&Iic, RecvBuffer, 2, IIC_SLAVE_ADDR);//		if (Status != XST_SUCCESS) {//			return XST_FAILURE;//		}xil_printf("P0=>%d",RecvBuffer[0]);xil_printf("P1=>%d",RecvBuffer[1]);sleep(1);}cleanup_platform();return 0;
}

亲测正常, 注意IIC的地址, 有的从0x20开始的, 有的是0x40开始的.

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何确定DFMEA中发生频率(O)的风险优先数(RPN)?

众所周知&#xff0c;DFMEA&#xff08;设计失效模式和效果分析&#xff09;特别关注于产品设计阶段的风险评估。在DFMEA中&#xff0c;风险优先数&#xff08;RPN&#xff09;是一个核心指标&#xff0c;用于量化失效模式的严重性&#xff08;S&#xff09;、发生频率&#xf…

goframe开发一个企业网站 前端界面 拆分界面7

将页面拆出几个公用部分 在resource/template/front创建meta.html header.html footer.html meta.html <head><meta charset"utf-8"><meta content"widthdevice-width, initial-scale1.0" name"viewport"><title>{{.…

充电宝哪个最好最耐用?2024盘点五款优质充电宝,附选购指南!

充电宝哪个最好最耐用?在电子设备日益普及的今天&#xff0c;充电宝成为了我们生活中的必需品&#xff0c;它不仅能够解决手机电量不足的燃眉之急&#xff0c;更是旅行、工作时的得力助手。然而&#xff0c;面对市场上众多品牌和型号的充电宝&#xff0c;如何挑选出既优质又耐…

五指cms安装

我在安装五指cms的过程中发现一个问题&#xff0c;我看到的大部分的安装指导并没有详细的告诉大家该怎样做。所以我写这篇博客来进行一个比较详细的指导。 第一步&#xff1a;解压我们的wuzhicms文件并将其移动到phpstudy的WWW文件目录下。 第二步&#xff1a; 在phpstudy配置…

新手学习大模型(LLM),应该从哪个模型开始

建议先从主流的Qwen2、Llama3.1上手&#xff0c;先快速体验提示词工程&#xff0c;然后再学习LLM模型架构&#xff0c;尝试RAG&#xff0c;跑LORA微调脚本。 进一步的学习目标: 学习如何从零训练大模型(1B左右规模&#xff0c;预训练SFTDPO)&#xff0c;打通整个流程。 钻研…

什么开放式耳机好用?开放式耳机品牌十大排名揭秘误区

对于很多消费者来说&#xff0c;了解什么开放式耳机好用是购买决策的关键。开放式耳机品牌十大排名可以为我们提供一些参考&#xff0c;但在这个过程中&#xff0c;我们也需要警惕一些误区。其中就包括一些关于开放式耳机的谣言&#xff0c;比如对耳朵有伤害、完全不漏音、是否…

javascript-Web APLs (三)

事件流 指的是事件完整执行过程中的流动路 说明&#xff1a;假设页面里有个div&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 简单来说&#xff1a;捕获阶段是 从父到子 冒泡阶段是从子到父 实际工作都是使用事件冒泡为主 事件…

Vue 组件基础(五)

一、Vue 组件的基础概念 组件(Component)是Vue最强大的功能之一。组件可以扩展HTML元素&#xff0c;封装可重用的代码。在较高层面上&#xff0c;组件是自定义元素&#xff0c;Vue的编译器为它添加特殊功能。每个组件负责一部分特定的任务&#xff0c;比如&#xff1a;显示一个…

大数据计算里的Broadcast Hash Join/Shuffle Hash Join/Sort Merge Join

文章目录 Broadcast Hash Join场景 Shuffle Hash Join场景 Sort Merge Join场景 Broadcast Hash Join 场景 大表和小小表&#xff0c;直接把B表加载到内存&#xff0c;然后读块1内容和内存中数据匹配 Shuffle Hash Join 场景 大表和小表JOIN &#xff0c;小表分块后能加载…

Docker打包自己项目推到Docker hub仓库(windows10)

一、启用Hyper-V和容器特性 1.应用和功能 2.点击程序和功能 3.启用或关闭Windows功能 4.开启Hyper-V 和 容器特性 记得重启生效&#xff01;&#xff01;&#xff01; 二、安装WSL2&#xff1a;写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/143057041 三…

谷粒商城のsentinelzipkin

文章目录 前言一、Sentinel1、什么是Sentinel2、项目配置3、使用案例3.1、流控3.2、降级3.3、黑白名单设置 二、Zipkin1、什么是Zipkin2、项目配置3、整合案例 前言 本篇介绍Spring Cloud Ali的sentinel组件&#xff0c;用于对微服务的熔断降级&#xff0c;以及链路追踪zipkin的…

Prism 七区域上下文关联

还是从头开始来。 1、区域上下文。 1.1、通过NuGet添加Prism.DryIoc。如下图。 1.2、新建WPF项目WpfApp1&#xff0c;创建Views和ViewModels文件夹&#xff0c;将MainWindow.xaml文件移动到 Views文件下&#xff0c;在ViewModels文件夹下添加MainWindowViewModel.cs文件。 …

UOS 安装usb wifi 网卡驱动

电脑上装安uos后发现usb网卡驱动不见了&#xff0c;网卡长下面这个样子&#xff0c;但是官方没有驱动 驱动网址选5300 https://www.ezcast.com/app/ezcast/wifi-adapter/windows 这时我们 lsusb找到相关设备&#xff0c;发现是Realtek 的设备 要在 Ubuntu 上安装 Realtek 0bda…

开放式耳机什么品牌质量好?5款排行榜里的开放式蓝牙耳机

​开放式耳机目前非常流行&#xff0c;它们以时尚、美观和舒适著称&#xff0c;迅速赢得了众多用户的喜爱&#xff0c;成为了耳机市场的新宠。与传统的入耳式耳机相比&#xff0c;开放式耳机佩戴更稳固&#xff0c;对耳朵也更为温和。尽管有些人认为它们价格不菲&#xff0c;甚…

二:Linux学习笔记(第一阶段)-- Linux命令

目录 Linux注意事项&#xff1a; Linux目录 Linux系统基础命令 1. 文件和目录操作 2. 文件查看和编辑 3. 文件权限和所有权 4. 系统信息 5. 网络命令 6. 文件查找 7. 压缩和解压缩 8. 系统管理 Linux注意事项&#xff1a; 严格区分大小写一切皆文件windows下的程序不…

【网络】Wireshark工具介绍和下载地址

https://www.wireshark.org/ 下载地址 介绍地址 Wireshark is a network protocol analyser. It can be used to capture packets from a network connection. Wireshark是一个网络协议分析器。它可以用来捕获来自网络连接的数据包。 1.1. What is Wireshark? Wireshark is…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

STM32的TIM中Prescaler和ClockDivision有什么用以及计数器溢出时间计算

我们在stm32中需要使用到时钟&#xff0c;在设置时容易把Prescaler和ClockDivision混淆&#xff0c;为什么有时候ClockDivision不需要设置呢&#xff1f;一下是解释&#xff1a; 1. Prescaler&#xff08;预分频器&#xff09; 功能&#xff1a;Prescaler 的作用是降低定时器的…

A011-基于SpringBoot的视频点播系统设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装视频点播系统软件来发挥其高效地信息处理的作用&#xff0c…

高阶数据结构--图(graph)

图&#xff08;graph&#xff09; 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…