2019独角兽企业重金招聘Python工程师标准>>>

  1. 概述

    本文档以STM32F767平台为例,详细介绍SylixOS上GPIO模仿I2C总线的驱动开发流程。

  2. 初始化

    GPIO模仿的I2C总线的初始化,实际上是I2C总线的SDA和SCL的GPIO管脚初始化。初始化流程如图 2.1所示。

    图 2.1 I2C初始化流程图

    代码实现,如程序清单 2.1所示。I2C总线的SDA和SCL两个GPIO管脚的GPIO速度要设置成快速模式,输出模式需要设置成推挽输出模式。

    程序清单 2.1 I2C初始化代码

    /**  申请 I2C 1 通道的 SCL 的 GPIO*/if (ERROR_NONE != API_GpioRequest(I2C1_CHANNEL_SCL, I2C1_SCL_GPIO_NAME)) {return  (PX_ERROR);}/**  设置上拉*/if (ERROR_NONE != API_GpioSetPull(I2C1_CHANNEL_SCL, GPIO_PUPD_PU)) {return  (PX_ERROR);}/**  设置为推挽输出模式,且 GPIO 速度为快速*/if (ERROR_NONE != API_GpioDirectionOutput(I2C1_CHANNEL_SCL,(GPIO_SPEED_SET    |GPIO_OTYPE_SET     |LW_GPIOF_INIT_HIGH))) {return  (PX_ERROR);}/**  申请 I2C 1 通道的 SDA 的 GPIO*/if (ERROR_NONE !=  API_GpioRequest(I2C1_CHANNEL_SDA, I2C1_SDA_GPIO_NAME)) {return  (PX_ERROR);}if (ERROR_NONE != API_GpioSetPull(I2C1_CHANNEL_SDA, GPIO_PUPD_PU)) {return  (PX_ERROR);}if (ERROR_NONE != API_GpioDirectionOutput(I2C1_CHANNEL_SDA,(GPIO_SPEED_SET  |GPIO_OTYPE_SET     |LW_GPIOF_INIT_HIGH))) {return  (PX_ERROR);}
  3. 传输流程

    GPIO模拟I2C总线驱动和普通的I2C总线驱动的最大区别是普通的I2C总线驱动的数据传输只要将要传输的数据写入寄存器即可,而GPIO模拟I2C总线驱动的数据传输是直接通过GPIO管脚将电平拉高拉低(拉高是1,拉低是0)传输数据。

  4. 写数据流程

    如程序清单 3.1所示,I2C的写数据流程如下:

    1. 主设备发送开始信号;

    2. 主设备发送7位从设备地址和1位写操作位;

    3. 从设备发送应答信号;

    4. 主设备发送要写的8位从设备内部地址;

    5. 从设备发送应答信号;

    6. 主设备开始对从设备写操作;

    7. 主设备发送结束信号。

    程序清单 3.1 I2C的写数据流程

    static INT  __i2cXferWrite (UINT             uiChannel,PLW_I2C_MESSAGE  pI2cMsg,INT              iLength)
    {INT  iIndex;__i2cStart(uiChannel);                                              /*  发送开始信号                *//**  发送 7 位器件地址和 1 位写操作位*/__i2cSendByte((pI2cMsg->I2CMSG_usAddr & I2C_ADDR_MASK), uiChannel);if (__i2cWaitAck(uiChannel)) {                                      /*  等待设备的 ACK 信号         */_DebugHandle(__ERRORMESSAGE_LEVEL, "__i2cXferWrite(): Timeout to wait ack!\r\n");return  (PX_ERROR);}/**  发送要读的设备的内部地址*/__i2cSendByte(((pI2cMsg->I2CMSG_usAddr) & I2C_INTER_ADDR_MASK), uiChannel);if (__i2cWaitAck(uiChannel)) {                                      /*  等待设备的 ACK 信号         */_DebugHandle(__ERRORMESSAGE_LEVEL, "__i2cXferWrite(): Timeout to wait ack!\r\n");return  (PX_ERROR);}for (iIndex = 0; iIndex < iLength; iIndex++) {__i2cSendByte(*(pI2cMsg->I2CMSG_pucBuffer)++, uiChannel);       /*  发送字节                    */if (__i2cWaitAck(uiChannel)) {                                  /*  等待设备的 ACK 信号         */_DebugHandle(__ERRORMESSAGE_LEVEL, "__i2cXferWrite(): Timeout to wait ack!\r\n");return  (PX_ERROR);}}__i2cStop(uiChannel);                                               /*  产生一个停止信号            */udelay(I2C_WRITE_BYTE_DELAY);return (ERROR_NONE);
    }
  5. 读数据流程

    如程序清单 3.2所示,I2C的读数据流程如下:

    1. 写模式,主设备发送开始信号;

    1. 主设备发送7位从设备地址和1位写操作位;

    2. 从设备发送应答信号;

    3. 主设备发送要写的8位从设备内部地址;

    4. 从设备发送应答信号;

    5. 进入读取模式,设备再次发送开始信号;

    6. 主设备发送7位从设备地址和1位读操作位;

    7. 从设备发送应答信号;

    8. 主设备开始对从设备读操作;

    9. 主设备发送结束信号。

    程序清单 3.2 I2C读数据流程

static INT  __i2cXferRead (UINT             uiChannel,PLW_I2C_MESSAGE  pI2cMsg,INT              iLength)
{INT  iIndex;__i2cStart(uiChannel);                                              /*  发送开始信号                *//**  发送 7 位器件地址和 1 位写操作位,(I2CMSG_usAddr 中的 9-15 位为器件地址)*/__i2cSendByte(((pI2cMsg->I2CMSG_usAddr >> 8) & I2C_ADDR_MASK), uiChannel);if (__i2cWaitAck(uiChannel)) {                                      /*  等待设备的 ACK 信号         */_DebugHandle(__ERRORMESSAGE_LEVEL, "__i2cXferWrite(): Timeout to wait ack!\r\n");return  (PX_ERROR);}/**  发送要读的设备的内部地址*/__i2cSendByte(((pI2cMsg->I2CMSG_usAddr) & I2C_INTER_ADDR_MASK), uiChannel);if (__i2cWaitAck(uiChannel)) {                                      /*  等待设备的 ACK 信号         */_DebugHandle(__ERRORMESSAGE_LEVEL, "__i2cXferWrite(): Timeout to wait ack!\r\n");return  (PX_ERROR);}/**  进入读取模式*/__i2cStart(uiChannel);                                              /*  发送开始信号                *//**  发送 7 位器件地址和 1 位读操作位,(I2CMSG_usAddr 中的 8-15 位为器件地址和读写位)*/__i2cSendByte(((pI2cMsg->I2CMSG_usAddr >> 8) & I2C_ADDR_MASK) | LW_I2C_M_RD, uiChannel);if (__i2cWaitAck(uiChannel)) {                                      /*  等待设备的 ACK 信号         */_DebugHandle(__ERRORMESSAGE_LEVEL, "__i2cXferWrite(): Timeout to wait ack!\r\n");return  (PX_ERROR);}for (iIndex = 0; iIndex < iLength - 1; iIndex++) {/**  读取设备发来的 1 个字节数据*/*(pI2cMsg->I2CMSG_pucBuffer)++ = __i2cReadByte(I2C_ACK_SEND, uiChannel);}*(pI2cMsg->I2CMSG_pucBuffer) = __i2cReadByte(I2C_NACK_SEND, uiChannel);__i2cStop(uiChannel);                                               /*  产生停止信号                */return  (ERROR_NONE);
}

转载于:https://my.oschina.net/u/3249576/blog/1625162

SylixOS 基于STM32平台的GPIO模仿I2C总线的驱动开发流程相关推荐

  1. I2C总线式驱动开发

    文章目录 前言 一.Linux内核对I2C总线的支持 1.1.理解I2C设备驱动.I2C总线驱动以及I2C核心之间的关系 1.2.i2c二级外设驱动开发涉及到核心结构体及其相关接口函数: 二.I2C总 ...

  2. Linux I2C子系统分析之(一) ----- 用GPIO模拟I2C总线

    在drivers/i2c/busses下包含各种I2C总线驱动,如S3C2440的I2C总线驱动i2c-s3c2410.c,使用GPIO模拟I2C总线的驱动i2c-gpio.c,这里只分析i2c-gp ...

  3. stm32中用到的实时系统_基于STM32平台的实时操作系统

    基于STM32平台且满足实时控制要求操作系统,有以下5种可供移植选择,分别为μClinux.μC/OS-II.eCos.FreeRTOS和都江堰操作系统(djyos). 下面分别介绍这五种嵌入式操作系 ...

  4. stm32 IOT_基于STM32平台的cubeMX和HAL库详解

    课程简介: <朱有鹏老师单片机完全学习系列课程>总共5季,其中第1.2季是51单片机学习,第3.4.5季是STM32单片机与RTOS学习.整个课程时长约250小时,是一套零基础.全面系统. ...

  5. 使用GPIO模拟I2C总线进行通信

    I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段.数据传输阶段和终止阶段. 1. 起始阶段 在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平.如果此时主 ...

  6. android教育游戏设计方案,基于Android平台的儿童教育游戏的设计与开发

    摘要: 在通讯技术和信息技术的不断发展时代,智能手机(平板电脑)等移动终端的普及和功能的不断强大,基于移动终端的移动学习的理念渐渐深入人心且被广大的学习者所青睐,逐渐成为一种新的学习方式.学习者在面对 ...

  7. 超调 matlab m文件,基于Matlab平台实现的复合轴控制系统超调控制方法与流程

    本发明属于复合轴控制技术领域,具体涉及一种基于Matlab平台实现的复合轴控制系统超调控制方法. 背景技术: 复合轴控制是近年来一种新兴的控制方法,其主要借助快速反射镜响应快.精度高的特点补偿常规控制 ...

  8. 基于ZCU106平台部署Vitis AI 1.2/2.5开发套件【Vivado+Vitis+Petalinux2020/2022】

    Vitis AI是 Xilinx 的开发平台,适用于在 Xilinx 硬件平台(包括边缘设备和 Alveo 卡)上进行人工智能算法推理部署.它由优化的IP.工具.库.模型和示例设计组成.Vitis A ...

  9. openwrt配置内核驱动_openwrt 增加RTC(MCP7940 I2C总线)驱动详解

    标签: 一.硬件平台 1.1 控制器:MT7620(A9内核) 1.2 RTC芯片:MCP7940(I2C总线) 二.软件平台 2.1.开发环境:Ubuntu12.04 2.2.软件版本:openwr ...

最新文章

  1. 分布式事务,阿里为什么钟爱TCC
  2. C#:委托和自定义事件
  3. MongoDB windows解压缩版安装
  4. Fedora Workstation 30是激动人心的、功能丰富的更新
  5. 1003. [ZJOI2006]物流运输【区间DP+最短路】
  6. StringStringBuilder的使用
  7. Hibernate 常见异常
  8. 和平精英、宾果消消消等多款游戏APP存隐私不合规行为
  9. MySQL_02之增删改查、PHP数据库操作
  10. 计算机病毒分析流程图,电脑病毒分析-熊猫烧香病毒分析.pdf
  11. Allegro视频教程
  12. QTTabBar 「资源管理器」让你的文件夹拥有浏览器标签页般的体验
  13. 使用python处理wps表格_Python处理Word文件的实用姿势
  14. maya 替换名称_Maya玛雅入门教程 MAYA粒子替换功能和Mel命令colorAtPoint教程
  15. 为什么刀剑总显示服务器繁忙,刀剑乱舞萌新必看攻略 常见问题篇
  16. nvme分区选mbr还是guid_怎么分辨硬盘是GUID格式还是MBR格式以及怎样更改
  17. uniapp接入微信客服聊天流程(企业微信)
  18. 自己编写wince的校准程序
  19. 软路由折腾记(一)openwrt
  20. (中缀)表达式转换成前缀表达式、后缀表达式

热门文章

  1. html在线测试接口,apiManager: 小幺鸡在线接口管理系统,支持在线测试,支持json,txt,xml,html,js,流,和 WebSocket...
  2. sql编辑器_SQL的弱点(3):缺少静态类型检查
  3. php 插入2个数组,用PHP将2个数组插入mysql
  4. TX的8B/10B编码功能
  5. 【FPGA】FIFO的Verilog设计之同步FIFO的设计
  6. 应用PlanAhead 进行布局规划
  7. WCF 第四章 绑定 msmqIntegrationBinding
  8. Java开发需掌握的常用Linux命令(持续更新)
  9. OPMS 1.2 版本更新发布
  10. 可设置指定时间自动消失的 MessageBox实现