/******************************************************************************* * 名 称: HT1621BWrCmd * 功 能: 向HT1621B中写指令 * 入口参数: Cmd为需要发送的指令 * 出口参数: 无 * 作 者: * 创建日期: 2015-01-05 * 修 改: * 修改日期: * 备 注: 写入命令标识位100 *******************************************************************************/ void HT1621BWrCmd(u8 Cmd) { HT1621B_CS_LOW(); _Nop(); /*延时10US*/ HT1621BWriteData(HT_WRITECMD,4); //写入命令标志100 HT1621BWriteData(Cmd,8); //写入命令数据 HT1621B_CS_HIGH(); _Nop(); /*延时10US*/ }
/******************************************************** 函数名称:void ht1621_wr_cmd(char Cmd) 功能描述: HT1621命令写入函数 全局变量:无 参数说明:Cmd为写入命令数据 返回说明:无 说 明:写入命令标识位100 ********************************************************/ void ht1621_wr_cmd(char cmd) { HT1621_CS=0; _Nop(); ht1621_wr_dat(0x80,4); //写入命令标志100 ht1621_wr_dat(cmd,8); //写入命令数据 HT1621_CS=1; _Nop(); }
static void i2c_sendnack(void) { SCL = 0; _Nop(); SDA = 1; _Nop(); SCL = 1; _Nop(); SCL = 0; _Nop(); }
static void i2c_sendbit(bool v) { SCL = 0; _Nop(); SDA = v; _Nop(); SCL = 1; _Nop(); SCL = 0; _Nop(); }
static bool i2c_recvbit(void) { bool v; SCL = 0; _Nop(); SCL = 1; _Nop(); v = SDA; SCL = 0; _Nop(); return v; }
static void i2c_waitack(void) { SCL = 0; _Nop(); SDA = 1; _Nop(); SCL = 1; _Nop(); while (SDA) ; SCL = 0; _Nop(); }
/******************************************************************* 结束总线函数 函数原型: void Stop_COM(); 功能: 命令发送结束信号 ********************************************************************/ void Stop_COM(void) { _CardSetCLK_LOW; _CardPutIO_LOW(); /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ _Nop(); _Nop(); _CardSetCLK_HIGH; /*结束条件建立时间大于4 s*/ DELAY5us(); _CardPutIO_HIGH(); /*发送总线结束信号*/ _Nop(); _Nop(); }
/****************************************************** 写数据函数,cnt为传送数据位数,数据传送为低位在前 *******************************************************/ void ht1621_wr_dat(char dat,char cnt) { char i; for (i=0;i<cnt;i++) { HT1621_WR=0; _Nop(); HT1621_DAT=dat&0x80; _Nop(); HT1621_WR=1; _Nop(); dat<<=1; } }
/******************************************************************* 起动总线函数 函数原型: void Start_COM(); 功能: 启动发送命令起始条件. ********************************************************************/ void Start_COM(void) { _CardPutIO_HIGH(); /*发送起始条件的数据信号*/ _CardSetCLK_LOW; _Nop(); _Nop(); _Nop(); _CardSetCLK_HIGH; DELAY5us(); /*起始条件建立时间大于4.7us,延时*/ _CardPutIO_LOW(); /*发送起始信号*/ DELAY5us(); /*起始条件锁定时间大于4 s*/ _CardSetCLK_LOW; /*钳住总线准备发送或接收数据 */ _Nop(); _Nop(); }
/******************************************************************* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束I2C总线,即发送I2C结束条件. ********************************************************************/ void Stop_I2c() { SDA=0; /*发送结束条件的数据信号*/ _Nop(); /*发送结束条件的时钟信号*/ SCL=1; /*结束条件建立时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); SDA=1; /*发送I2C总线结束信号*/ _Nop(); _Nop(); _Nop(); _Nop(); }
/*---------------------------------------------------------------- 非应答子函数 原型: void NoAck_I2c(void); ----------------------------------------------------------------*/ void NoAck_I2c(void) { SDA(1); _Nop(); _Nop(); _Nop(); SCL(1); _Nop(); _Nop(); //时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL(0); //清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); }
/******************************************************** 函数名称:void ht1621_wr_one(char addr,char dat) 功能描述: HT1621在指定地址写入数据函数 全局变量:无 参数说明:addr为写入初始地址SEG[31:0],Data为写入数据COM[3:0] 返回说明:无 说 明:因为HT1621的数据位4位,所以实际写入数据为参数的后4位 ********************************************************/ void ht1621_wr_one(char addr,char dat)// { HT1621_CS=0; ht1621_wr_dat(0xa0,3); //写入数据标志101 ht1621_wr_dat(addr<<2,6); //写入地址数据 ht1621_wr_dat(dat<<4,4); //写入数据 HT1621_CS=1; _Nop(); }
/******************************************************************** 应答子函数 函数原型: void Ack_I2c(bit a); 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2c(bit a) { if(a==0)SDA=0; /*在此发出应答或非应答信号 */ else SDA=1; _Nop(); _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); /*时钟低电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; /*清时钟线,钳住I2C总线以便继续接收*/ _Nop(); _Nop(); }
/******************************************************************************* * 名 称: HT1621BWrOneData * 功 能: HT1621B在指定地址写入数据函数 * 入口参数: Addr为写入初始地址,Data为写入数据 * 出口参数: 无 * 作 者: * 创建日期: 2015-01-05 * 修 改: * 修改日期: * 备 注: 因为HT1621B的数据位4位,所以实际写入数据为参数的后4位 、 * HT1621B的地址位6位,所以实际写入数据为参数的后6位 、 *******************************************************************************/ void HT1621BWrOneData(u8 Addr,u8 Data) { HT1621B_CS_LOW(); HT1621BWriteData(HT_WRITEDATA,3); //写入数据标志101 HT1621BWriteData(Addr<<2,6); //写入地址数据 HT1621BWriteData(Data<<4,4); //写入数据 HT1621B_CS_HIGH(); _Nop(); /*延时10US*/ }
/******************************************************************* 字节数据传送函数 函数原型: void SendByte(unsigned char c); 功能: 将数据c 发送出去,可以是命令,也可以是数据 ********************************************************************/ void SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8 位*/ { if((c>>BitCnt)&0x01) { _CardPutIO_HIGH(); /*判断发送位*/ } else { _CardPutIO_LOW(); } _Nop();_Nop(); _CardSetCLK_HIGH; /*置时钟线为高通知被控器开始接收数据位*/ DELAY5us(); /*保证时钟高电平周期大于4 s*/ _CardSetCLK_LOW; }
/******************************************************************************* * 名 称: HT1621BWriteData * 功 能: 向HT1621B中写指定位数的数据函数 * 入口参数: Data为需要传送的数据 * cnt为传送数据位数,数据传送为低位在前 * 出口参数: 无 * 作 者: * 创建日期: 2015-01-05 * 修 改: * 修改日期: * 备 注: *******************************************************************************/ static void HT1621BWriteData(u8 Data,u8 cnt) { for (u8 i=0;i<cnt;i++) { HT1621B_WR_LOW(); _Nop(); /*延时10US*/ if(Data&0x80) { HT1621B_DATA_HIGH(); }else { HT1621B_DATA_LOW(); } _Nop(); /*延时10US*/ HT1621B_WR_HIGH(); _Nop(); /*延时10US*/ Data<<=1; } }
/******************************************************************************* * 名 称: HT1621BWrStrData * 功 能: HT1621B连续写入数据函数 * 入口参数: Addr为写入初始地址,*p为连续写入数据指针,cnt为写入数据总数 * 出口参数: 无 * 作 者: * 创建日期: 2015-01-05 * 修 改: * 修改日期: * 备 注: HT1621的数据位4位,此处每次数据为8位,写入数据总数按8位计算 *******************************************************************************/ void HT1621BWrStrData(u8 Addr,u8 *p,u8 cnt) { HT1621B_CS_LOW(); HT1621BWriteData(HT_WRITEDATA,3); //写入数据标志101 HT1621BWriteData(Addr << 2,6); //写入地址数据 for (u8 i=0;i<cnt;i++) { HT1621BWriteData(*p,8); //写入数据 p++; } HT1621B_CS_HIGH(); _Nop(); /*延时10US*/ }
/******************************************************** HT1621测试程序,2008-2-13, 22:41:43 函数名称:void ht1621_wr_cnt(char addr,char *p,char cnt) 功能描述: HT1621连续写入方式函数 全局变量:无 参数说明:addr为写入初始地址,*p为连续写入数据指针, cnt为写入数据总数 返回说明:无 说 明:HT1621的数据位4位,此处每次数据为8位,写入数据 总数按8位计算 ********************************************************/ void ht1621_wr_cnt(char addr,char *p,char cnt) { char i; HT1621_CS=0; ht1621_wr_dat(0xa0,3); //写入数据标志101 ht1621_wr_dat(addr<<2,6); //写入地址数据 for (i=0;i<cnt;i++) { ht1621_wr_dat(*p,8); //写入数据 p++; } HT1621_CS=1; _Nop(); }
/*---------------------------------------------------------------- 字节数据传送函数 函数原型: unsigned char I2C_RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 ------------------------------------------------------------------*/ unsigned char I2C_RcvByte(void) { unsigned char retc; unsigned char BitCnt; retc=0; SDA(1); //置数据线为输入方式 for(BitCnt = 0; BitCnt < 8; BitCnt++) { _Nop(); SCL(0); //置时钟线为低,准备接收数据位 _Nop(); _Nop(); //时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL(1); //置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc = retc << 1; if(Read_SDA()) retc = retc + 1; //读数据位,接收的数据位放入retc中 _Nop(); _Nop(); } SCL(0); _Nop(); _Nop(); return(retc); }
/******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. ********************************************************************/ void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7us,延时*/ _Nop(); _Nop(); _Nop(); _Nop(); SDA=0; /*发送起始信号*/ _Nop(); /* 起始条件锁定时间大于4μs*/ _Nop(); _Nop(); _Nop(); _Nop(); SCL=0; /*钳住I2C总线,准备发送或接收数据 */ _Nop(); _Nop(); }
/******************************************************************* 字节数据发送函数 函数原型: void SendByte(UCHAR c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ********************************************************************/ void SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/ { if((c<<BitCnt)&0x80)SDA=1; /*判断发送位*/ else SDA=0; _Nop(); SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/ _Nop(); _Nop(); /*保证时钟高电平周期大于4μs*/ _Nop(); _Nop(); _Nop(); SCL=0; } _Nop(); _Nop(); SDA=1; /*8位发送完后释放数据线,准备接收应答位*/ _Nop(); _Nop(); SCL=1; _Nop(); _Nop(); _Nop(); if(SDA==1)ack=0; else ack=1; /*判断是否接收到应答信号*/ SCL=0; _Nop(); _Nop(); }
/******************************************************************* 字节数据接收函数 函数原型: UCHAR RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 ********************************************************************/ unsigned char RcvByte() { unsigned char retc; unsigned char BitCnt; retc=0; SDA=1; /*置数据线为输入方式*/ for(BitCnt=0;BitCnt<8;BitCnt++) { _Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/ _Nop(); _Nop(); /*时钟低电平周期大于4.7μs*/ _Nop(); _Nop(); _Nop(); SCL=1; /*置时钟线为高使数据线上数据有效*/ _Nop(); _Nop(); retc=retc<<1; if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ _Nop(); _Nop(); } SCL=0; _Nop(); _Nop(); return(retc); }