📄 key&i2c.c.svn-base
字号:
/****************************************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 + -