?? rr_i2c.c
字號:
/***************************************************************//* i2c for PMU(PCF50606) control *//* Date : 2004. 03. 16 *//* Version : 0.1 *//* Reigncom Ltd. */ /* *//***************************************************************/ #include "i2c.h"//========== Definitions =================#define REG *(volatile unsigned short *)#define OSEL 0x3089A#define O0DIV 0x3089C#define O1DIV 0x3089E#define PWM0C 0x308A2#define PWM0H 0x308A4#define PWM1C 0x308A6#define PWM1H 0x308A8#define BITSET_BASE 0x3058C#define BITCLR_BASE 0x30592#define DIR_BASE 0x30580void GIODirSet(unsigned char port, unsigned char dir){ unsigned char gio_offset = 0; while(port > 15){ port -= 16; gio_offset +=2; } if(dir) REG (DIR_BASE + gio_offset) |= (1 << port); else REG (DIR_BASE + gio_offset) &= ~(1 << port); }void GIOSet(unsigned char port,unsigned char set){ unsigned char gio_offset = 0; while(port > 15){ port -= 16; gio_offset +=2; } if(set) REG (BITSET_BASE + gio_offset) = (1 << port); else REG (BITCLR_BASE + gio_offset) = (1 << port); }unsigned char GIOGet(unsigned char port){ unsigned char gio_offset = 0; unsigned short temp; unsigned char res; while(port > 15){ port -= 16; gio_offset += 2; } temp = REG (BITSET_BASE + gio_offset); res = temp & (1 << port); if(res) return(1); else return(0);}void set_PMU_SCL_High(void){// REG BITSET1 = PMU_SCL_GIO; GIOSet(PMU_SCL_GIO,1);}void set_PMU_SCL_Low(void){ // REG BITCLR1 = PMU_SCL_GIO; GIOSet(PMU_SCL_GIO,0);}void set_PMU_SDA_High(void){ // REG BITSET1 = PMU_SDA_GIO; GIOSet(PMU_SDA_GIO,1);}void set_PMU_SDA_Low(void){ // REG BITCLR1 = PMU_SDA_GIO; GIOSet(PMU_SDA_GIO,0);}void make_PMU_SDA_Input(void){// GIODirSet(PMU_SDA_GIO,1); REG 0x30584 |= (0x1);}void make_PMU_SDA_Output(void){// GIODirSet(PMU_SDA_GIO,0); REG 0x30584 &= ~(0x1);}unsigned char get_SDA(void){ volatile unsigned char temp; i2c_wait(); make_PMU_SDA_Input(); i2c_wait(); set_PMU_SCL_High(); i2c_wait(); i2c_wait(); i2c_wait(); i2c_wait(); i2c_wait(); temp = GIOGet(PMU_SDA_GIO); set_PMU_SCL_Low(); i2c_wait(); i2c_wait(); i2c_wait(); if(temp) return(1); else return(0);}unsigned char get_Ack(void){ volatile unsigned char res=0; res = get_SDA(); make_PMU_SDA_Output(); if(!(res & 0x1)) return(1); else return(0); }void send_Ack(void){ GIOSet(PMU_SDA_GIO,0);}void send_Nack(void){ GIOSet(PMU_SDA_GIO,1);}void i2c_wait(void){ unsigned char i; for(i=0;i<200;i++) ;}void i2c_Init(void){ set_PMU_SCL_High(); set_PMU_SDA_High(); GIODirSet(PMU_SCL_GIO,0); //dedicated gio output. GIODirSet(PMU_SDA_GIO,0); //dedicated gio output. i2c_wait(); i2c_Open(); i2c_wait();}void i2c_Open(void){ set_PMU_SDA_Low(); i2c_wait(); set_PMU_SCL_Low();}void i2c_Stop(void){ set_PMU_SDA_Low(); set_PMU_SCL_High(); i2c_wait(); set_PMU_SDA_High();}int i2c_Send_Byte(unsigned char buff){ int j=8; while(j--){ i2c_wait(); if(buff & (0x1 << j)){ set_PMU_SDA_High(); }else{ set_PMU_SDA_Low(); } i2c_wait(); set_PMU_SCL_High(); i2c_wait(); set_PMU_SCL_Low(); } return 0;}unsigned char i2c_Read_Byte(void){ int i =8; volatile unsigned char temp,res= 0; while(i--){ temp = get_SDA(); res |= (temp << i); i2c_wait(); } return res;}void i2c_writeReg(unsigned char devaddr, unsigned char subaddr, unsigned char value, unsigned char *successflag){ unsigned char flag=1; i2c_Init(); i2c_Send_Byte(devaddr & 0xfe); //device write addr... flag &= get_Ack(); i2c_Send_Byte(subaddr); flag &= get_Ack(); i2c_Send_Byte(value); flag &= get_Ack(); i2c_Stop(); *successflag = (flag)? 0 : 1;}unsigned char i2c_readReg(unsigned char devaddr, unsigned char subaddr, unsigned char *successflag){ unsigned char val,flag = 1; i2c_Init(); i2c_Send_Byte(devaddr & 0xfe); flag &= get_Ack(); i2c_Send_Byte(subaddr); flag &= get_Ack(); i2c_Init(); i2c_Send_Byte(devaddr |= 0x01); flag &= get_Ack(); i2c_wait(); val = i2c_Read_Byte(); make_PMU_SDA_Output(); i2c_wait(); send_Nack(); i2c_Stop(); *successflag = (flag)? 0 : 1; return(val);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -