教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

liminary1138学习手记(3)

来源:网络收集 时间:2026-01-15
导读: 可以传输多个字节的有效数据。在实际应用当中以“主机突发发送”和“主机突发发送后主机接收”这两种模式最为常见。 当I2C模块作为总线上的从机时,收发操作仍然是由(另外的)主机控制的。当从机被寻址到时会触发

可以传输多个字节的有效数据。在实际应用当中以“主机突发发送”和“主机突发发送后主机接收”这两种模式最为常见。

当I2C模块作为总线上的从机时,收发操作仍然是由(另外的)主机控制的。当从机被寻址到时会触发中断,将被要求接收或发送数据。通过调用函数I2CSlaveStatus( ),就能获得主机的操作要求,有以下几种情况: ??主机已经发送了第1个字节:该字节应当被视为数据地址(或数据地址首字节) ??主机已经发送了数据:应当及时读取该数据(也可能是数据地址后继字节) ??主机要求接收数据:应当根据数据地址找到存储的数据然后回送给主机

###############################################################################

主机对于数据的发送和接受的实现,包含在LM3S_I2CM.h头文件中的接受与发送函数unsigned long I2CM_SendRecv(tI2CM_DEVICE *pDevice, tBoolean bFlag)和中断处理函数void I2C_ISR(void),其思想如下:

###############################################################################

数据地址长度或收发数据大小不能为0,否则不执行任何操作 数据地址长度不能超过4B

将数据地址分解成数组,高位放在gcAddr[0]中 如果是多主机通信,则需要首先等待总线空闲 设置从机地址,写操作 开始发送数据地址

设置状态:发送数据地址 命令:主机突发发送起始

之后发生中断,进入中断处理函数 {

若遇到错误,返回,状态是STAT_IDLE CASE STAT_ADDR:

若数据地址未发送完毕,继续发送数据地址,

命令:主机突发发送继续。这里从机又接收到数据、故而有发生中断, 若数据地址发送完毕,那么,状态改为STAT_DATA(收发数据), 如果为接收数据,设置从机地址,读操作,

只为一个字节的数据大小时,状态改为STAT_FINISH(收发结束), 命令:主机单次接收;

不是一个字节的数据大小时, 命令:主机突发接收起始; 等待总线操作完毕

总线上有数据时触发中断 进入STAT_DATA: // 若是接收操作 读取接收到的数据 / 若数据未接收完毕 命令:主机突发接收继续 /如果数据接收完毕 设置状态:接收完成 命令:主机突发接收完成

//若是发送数据 发送数据

/ 若数据未发送完毕 命令:主机突发发送继 / 若数据发送完毕 设置状态:发送完成 命令:主机突发发送完成 进入STAT_FINISH: // 若是接收操作

// 读取接最后收到的数据 // 设置状态:空闲

}

总线操作完毕

// 返回可能的错误状态

############################################################################### 从机的中断处理函数解析: 读从机中断状态 清从机中断状态

如果有中断继续向下进行 读从机状态 、、如果是主机没有请求任何动作I2C_SLAVE_ACT_NONE 退出 、、如果是主机已发送从机地址和子地址首字节I2C_SLAVE_ACT_RREQ_FBR 读取子地址

退出 、、如果是主机已经发送数据到从机I2C_SLAVE_ACT_RREQ 读取数据 、、如果是主机请求从机发送数据I2C_SLAVE_ACT_TREQ 发送数据 对于32位的编程,一个整体的框架就是:首先是对相关外围模块的使能或者说是时钟的使能,紧接着就是相关端口模块的使能与端口的配置作业,用得到中断的地方要开中断,当然要全部开放的,少一个中断就无法进行,再就是模块的使能了。对于中端处理函数来说,首先是得注册的,这样才能对相关的中端进行处理。具体的中端操作是,读状态,清中断,然后才是相关的处理。

对于UART

函数I2CM_DeviceInitSet( )和I2CM_DeviceDataSet( )用来初始化tI2CM_DEVICE类型的结构体变量。

函数I2CM_Init( )对I2C模块的硬件进行必要的初始化配置,并使能中断。 函数I2CM_SendRecv( )是重要的用户接口函数。器件的数据地址有效长度可能是1~4字节,如果在中断服务函数I2C_ISR( )里直接对长整型的数据成员ulAddr进行操作会显得很笨拙,

因此在该函数里利用switch语句将其转换为一个数组gcAddr[ ],以多字节形式存储器件的数据地址。

在函数I2CM_SendRecv( )里,初始化设置从机地址和第1个要发送的数据后,利用函数I2CMasterControl( )执行命令“主机突发发送起始”,总线动作是“S | SLA+W | data”,这里的data应当是器件的数据存储地址首字节。此时的工作状态是STAT_ADDR(发送数据地址)。在正式启动总线之前,还利用函数I2CMasterBusBusy( )来判断总线是否忙,这可以用来支持多主机通信的情况。剩下的数据收发工作可以由中断服务函数I2C_ISR( )全部自动完成。因此接下来的while循环是在等待总线操作完毕。最后返回可能的错误状态,如被寻址的器件不存在、数据无应答、仲裁失败等。

在中断服务函数I2C_ISR( )里,核心部分是一个长长的switch语句,对3种工作状态STAT_ADDR(发送数据地址)、STAT_DATA(接收或发送数据)和STAT_FINISH(收发完成)分别做出处理。

如果工作状态是STAT_ADDR,表明正处于发送数据地址的状态。如果未发送完毕则继续发送,利用函数I2CMasterControl( )执行命令“主机突发发送继续”;如果发送完毕则工作状态要转为STAT_DATA。进入STAT_DATA状态时又分为3种情况:如果仅接收1个字节的数据,则执行命令“主机单次接收”,并改变工作状态为STAT_FINISH;如果要接收多个字节的数据,则执行命令“主机突发发送起始”;如果是要发送数据,不论是单字节还是多字节,都直接进入下一条case语句,即处理STAT_DATA的状态。

如果工作状态是STAT_DATA,则表明正处于数据接收或发送的状态。如果是接收操作,则用函数I2CMasterDataGet( )读取接收到的数据,然后判断是否准备接收最后1个字节的数据,是则执行命令“主机突发接收完成”,并修改工作状态为STAT_FINISH,否则执行命令“主机突发接收继续”。如果是发送操作,若未发送完毕则继续发送,执行命令“主机突发发送继续”,否则执行命令“主机突发发送完成”,并修改工作状态为STAT_FINISH。

如果工作状态是STAT_FINISH,则表明数据收发工作已经完成,若是接收操作还要读取最后接收到的数据。最后把工作状态变成STAT_IDLE(空闲),以通知主程序收发工作已经完成。

当新接触到一个芯片时,首先,了解其寄存器结构,也是有一定的必要的,当然你也可以跳过此步,倘若有固件库的话,我们可以完全撇开寄存器来进行编程。最好的情况就是能找到固件库中文使用手册,那样就可以减少你啃原版英文资料的时间了,不过可能翻译的不太标准,影响到你的进程,那谁又敢说固件库里边没有说错呢?

…… 此处隐藏:1448字,全部文档内容请下载后查看。喜欢就下载吧 ……
liminary1138学习手记(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/447090.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)