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

📄 rr_i2c.c

📁 针对德州仪器DM270开发板的bootloader,其实现了内核的下载以及文件系统的下载
💻 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 + -