• 大小: 155.18 KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-09-14
  • 语言: 其他
  • 标签: 8050  F040  smbus  i2c  

资源简介

8051F040SMBUS多机通信包括SMBUS的总线设计及程序的详细设计与实现,8051F040的smbus与I2c兼容

资源截图

代码片段和文件信息

#include “i2c.h“

/*****************SMBUS中用到得常量*************************************/
#define WRITE 0xfe // 写方向位
#define READ 0x01 // 读方向位

#define SMB_BUS_ERROR 0x00 // 对所有方式总线错误
#define SMB_START 0x08 // (MT & MR) 起始条件已发送
#define SMB_RP_START 0x10 // (MT & MR) 重复起始条件
/*********************************************************/

/**************内部所用函数*****************/
//主从设备都用到的函数
static void SMBUS_ISR();   //I2C中断函数
static void DoSomething(); //用作出错处理
//主器件所用函数
static void AddressSend(unsigned char CurrentState);
static void ResetDataQueue();      //将数据发送重置
static void DataSendMaster();      //主设备发送数据的函数
static void DataReceiveMaster();   //主设备接收数据的函数
//从器件所用函数
static void DataSendSlave();       //从设备发送数据的函数
static void DataReceiveSlave();    //从设备接收数据的函数
static void ResetSlaveBuffer();   //重置从设备接收器
/*******************************************/

/***************内部所用数据*******************/

//主设备用到的数据
static unsigned char i2csendchecker = 0; //主设备用于校验
static unsigned char i2cslaveaddress = 0; //需要连接的从设备地址
static unsigned char *smbusdata*smbustranslatestate;//smbusdata:要发送的数据
                                                 //smbustranslatestate:数据传输状态 是否传输完毕
static unsigned char i2ctempstate = 0;//从设备地址+传输状态,传输状态有正在传输,传输完毕,数据无法到达3种
                                      //其实是一个临时数据,会被赋值给*smbustranslatestate
static unsigned char i2cerror = 0i2ccommandstore;//commandstore用于暂存smbus发送命令
static unsigned char i2cresendcount = 0;//resendcount重发次数的计数如果重发次数大于10次则认为是不能连通
                                     //主设备用到的计数器
static unsigned char smbus_send_size;//需要发送的字节数
static unsigned char smbus_send_counter;//发送计数器
//从设备用到的数据
static unsigned char *i2creceivedbuf;//接收缓冲区 
static unsigned char smbus_receive_size;//需接收的字节数
static unsigned char smbus_recieve_counter;//接收计数器
static unsigned char i2creceivecommand; //接收的命令
static unsigned char i2creceivechecker; //接收时用到的检验码
static unsigned char i2cmasteraddr; //某次通信主设备地址
/****************************************/


/********************对外提供得接口*************************************/
void CreateI2CDevice(unsigned char DeviceAddressunsigned char *ReceiveData)
//创建i2c的通信设备 需要配置缓冲区以及收到的字节数大小和收到字节计数器
{
   unsigned char oldpage;
   i2creceivedbuf = ReceiveData;//配置数据接收的缓冲区
   smbus_receive_size=0;    //需接收的字节数为0当收到从主设备发送过来的字节数之后会改变这个值
   smbus_recieve_counter=0;  //计数器,在接收时改变这个值
   i2creceivecommand=0;
   i2creceivechecker=0;
   //操作寄存器
   oldpage=SFRPAGE;
   SFRPAGE=SMB0_PAGE;
   SMB0CN = 0x44;                  //使能I2C端口及应答位
   SMB0CR = -25;                   //配置I2C设备速度到达400k bits
   SMB0ADR = DeviceAddress;        //设置设备地址
   SI = 0;                          //清除中断标志
   SFRPAGE=oldpage;
}
void I2CSend(unsigned char slavedeviceaddrunsigned char *comu_dataunsigned char datasizeunsigned char commandunsigned char *translatestate)
//发送数据 slavedeviecaddr:从设备地址,comu_data需要发送的数据,datasize,发送数据的字节数
//translatestate传输状态
//0000数据正在传输中
//0001数据传输经重试后仍无法

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      16763  2009-05-19 11:05  i2c.c

     文件     423424  2009-05-20 15:49  I2C接口设计.doc

     文件       1161  2009-05-19 11:02  i2c.h

----------- ---------  ---------- -----  ----

               441348                    3


评论

共有 条评论