⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key&i2c.c.svn-base

📁 一个基于UCOS/2操作系统开发的实际产品(电力负控)的代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
********************************************************************************************************/

#define IN_I2C
#include "Includes.h"

#define I2C_WRITE_END       1           /* 写完成   */
#define I2C_READ_END        2           /* 读完成   */
#define I2C_NOT_GET_BUS     4           /* 丢失仲裁 */
#define I2C_ACK_ERR         8           /* 接收ACK错误 */

#define  ZLG7290 	   0x70 		
#define  SystemReg     0x00 
#define  Key  	       0x01
#define  RepeatCnt     0x02 
#define  FunctionKey   0x03
#define  FastPressCnt  0x04
#define  CmdBuf0       0x07
#define  FlashOnOff    0x0c
#define  ScanNum       0x0d
#define  DpRam0        0x10

#define  KeyPress      0x01

/*********************************************************************************************************
** 函数名称: KeyInit
** 功能描述: 初始化Key 芯片ZLG 7290
**
** 输 出:无
** 全局变量: KeyMbox
** 调用模块: OSMBoxCreate
********************************************************************************************************/
       void KEYInit(void)
{
 
  
  PINSEL1 = (PINSEL1 & 0xcfffffff) | 0x20000000;            /* 选择管脚P0.30 为INT3 */
  KeyMbox = OSMboxCreate(NULL);
  
  if(KeyMbox==NULL)return;
  WaitKey=0;
  VICIntEnable |=  1 << 0x11;

}

/*********************************************************************************************************
** 函数名称: Wait_KeyPress
** 功能描述: 等待按键
** 输 入: WaitTime :等待时间
**
** 输 出:读取的数据 0xff为无按键
********************************************************************************************************/
 
uint8 Wait_KeyPress(uint32 WaitTime)

{
  uint8 err;
  
  WaitKey=1;
  OSMboxPend(KeyMbox,WaitTime, &err);               /* 等待按键 */
  WaitKey=0;
  if(err==OS_NO_ERR)
     return Key_GetPress();
   else
    return 0xff;
}
/*********************************************************************************************************
** 函数名称: ZLG7290_Getchar
** 功能描述: 读取ZLG7290 字节
** 输 入: 读取地址
**
** 输 出:读取的数据
********************************************************************************************************/
 
uint8 Key_GetByte(uint8 SubAdd)
{
    uint8 dat_buf[2];
    dat_buf[0] = 0x00;
    I2cRead(ZLG7290, dat_buf, &SubAdd, 1, 1);
	return dat_buf[0];
}

/*********************************************************************************************************
** 函数名称: ZLG7290_Key
** 功能描述: 读取ZLG7290 按键号
** 输 入: 无
**
** 输 出:读取的按键
********************************************************************************************************/
 
uint8 Key_GetPress(void)
{
    return(Key_GetByte(Key));
}

/*********************************************************************************************************
** Function name:			KEY_INT3_Exception
**
** Descriptions:			KEY_INT3 interrupt service function
********************************************************************************************************/
        void KEY_INT3_Exception(void)
{

    OS_ENTER_CRITICAL();
    if(WaitKey==1)
       OSMboxPost(KeyMbox, (void *)KeyPress);
    EXTINT  =EXTINT&0x08;
    VICVectAddr = 0;            //interrupt close 通知中断控制器中断结束
    OS_EXIT_CRITICAL();
   
}

/*********************************************************************************************************
** 函数名称: I2cInit
** 功能描述: 初始化I2c(主模式)
** 输 入: FI2c:I2c总线频率
**
** 输 出:TRUE  :成功
**        FALSE:失败
** 全局变量: I2cSem,I2cMbox
** 调用模块: OSSemCreate
********************************************************************************************************/
        uint8 I2cInit(uint32 FI2c)
{
    VICIntEnClr = 1 << 9;                           /* 禁止能I2c中断 */
    if (FI2c <= 400000)
       {
        PINSEL0 = (PINSEL0 & 0xffffff0f) | 0x50;    /* 选择管脚为I2c */
        I2CONCLR = 0x6C;                            /* 清除控制寄存器 */
        I2SCLH = (Fpclk / FI2c + 1) / 2;            /* 设置高电平时间 */
        I2SCLL = (Fpclk / FI2c) / 2;                /* 设置低电平时间 */
        I2CONSET = 0x40;                            /* 设置控制寄存器 */
        I2cSem = OSSemCreate(1);                    /* 信号量用于互斥操作总线 */
        I2cMbox = OSMboxCreate(NULL);               /* 消息邮箱用于中断向任务传递操作结果 */
        if (I2cMbox == NULL)
           return FALSE;
        if (I2cSem != NULL)
            return TRUE;
       }
   return FALSE;
}

/*********************************************************************************************************
** 函数名称: I2cWriteByte
** 功能描述: 读I2C,但不发送STOP信号 
** 输 入: Addr:从机地址
**        Data:将要写的数据
**        写的数据数目
** 输 出:发送的数据字节数
**
** 全局变量: I2cAddr,I2cNbyte,I2cBuf
** 调用模块: OSMboxPend
********************************************************************************************************/
        uint8 I2cWriteByte(uint8 Addr, uint8 *Data, int16 NByte)
{
    uint8 err;
    unsigned int Rt;

    I2cAddr = Addr & 0xfe;                              /* 存储发送地址 */
    I2cNbyte = NByte;                                   /* 存储写字节数 */
    I2cBuf = Data;                                      /* 存储写的数据的指针 */
    I2CONSET = 0x24;                                    /* 设置为主机,并启动总线 */

    Rt = (unsigned int) OSMboxPend(I2cMbox, 0, &err);   /* 等待操作结束 */
    //Rt=I2c_Wait();
    return Rt;
}


/*********************************************************************************************************
** 函数名称: I2cWrite
** 功能描述: 向I2C从器件写数据
** 输 入: Addr:从机地址
**        Data:指向将要写的数据的指针
**        NByte:写的数据数目
** 输 出:发送的数据字节数
**
** 全局变量: I2cSem,I2cNbyte
** 调用模块: OSSemPend,__I2cWrite,OSSemPost
********************************************************************************************************/
        uint16 I2cWriteBuf(uint8 Addr, uint8 *Data, int16 NByte)
{
    uint8 err;
    
    OSSemPend(I2cSem, 0, &err);
    
    I2CONCLR = 0x6C;
    I2CONSET = 0x40;                              /* 使能I2c */
    VICIntEnable = 1 << 9;                      /* 使能I2c中断 */

    if (I2cWriteByte(Addr, Data, NByte) == I2C_WRITE_END)
    {
        I2CONSET = 1 << 4;                      /* 发送停止信号 */
        I2CONCLR = 0x28;                        /* 清除标志 */
    }

    VICIntEnClr = 1 << 9;                       /* 禁止能I2c中断 */

    OSSemPost(I2cSem);
    return (NByte - I2cNbyte);
}

/*********************************************************************************************************
** 函数名称: I2cRead
** 功能描述: 从I2c从器件读数据
** 输 入: Addr:从机地址
**        Ret:指向返回数据存储位置的指针
**        Eaddr:扩展地址存储位置
**        EaddrNByte:扩展地址字节数,0为无
**        ReadNbyte:将要读取的字节数目
** 输 出:已读取的字节数
**
** 全局变量: I2cSem,I2cAddr,I2cNbyte,I2cBuf
** 调用模块: OSSemPend,__I2cWrite,OSMboxPend,OSSemPost
********************************************************************************************************/
        int16 I2cRead(uint8 Addr, uint8 *Ret, uint8 *Eaddr, int16 EaddrNByte, int16 ReadNbyte)
{
    uint8 err;
    
    OSSemPend(I2cSem, 0, &err);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -