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

📄 iic.h

📁 CAN总线设备驱动
💻 H
字号:
#ifndef __ASM_ARCH_SPI_H#define __ASM_ARCH_SPI_H#include <asm/arch/hardware.h>#include <linux/delay.h>#define GPIO_IIC_SCL			(GPIO_MODE_ALT0 | GPIO_PULLUP_DIS | GPIO_E14)#define GPIO_IIC_SDA		(GPIO_MODE_ALT0 | GPIO_PULLUP_DIS | GPIO_E15)#define IIC_READ				1#define TRUE 1#define FALSE 0#define WAIT_IICACK()	do{int i=0; \			while(!(IICCON&IICCON_INTPEND)){ i++; udelay(10);\			 if(i>100){ /*printk("iic ack time out!\n");*/ break;} }\			}while(0)inline static void Set_IIC_mode(int nIICCON, int *poldIICCON){		if(poldIICCON){		*poldIICCON=IICCON;	}	IICCON=nIICCON;}inline static void IIC_init(void){	static int time=0;	if(time!=0)		return;	time++;		set_gpio_ctrl (GPIO_IIC_SCL);	set_gpio_ctrl (GPIO_IIC_SDA);	//Enable ACK, Prescaler IICCLK=PCLK/512, Enable interrupt, Transmit clock value Tx clock=IICCLK/4	// If PCLK 50.7MHz, IICCLK = 99KHz, Tx Clock = 25KHz	IICCON = IICCON_ACKEN |IICCON_CLK512 | IICCON_INTR | IICCON_CLKPRE(0x3);	IICADD  = 0x10;                    //2410 slave address = [7:1]	IICSTAT = 0x10;                    //IIC bus data output enable(Rx/Tx)}inline static void IIC_MasterTxStart(char data){	int i;	IICDS   = data;	for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL	IICSTAT = IICSTAT_MODE_MT|IICSTAT_START|IICSTAT_OUTEN;	//MasTx,Start 0xf0//	while(!(IICCON&IICCON_INTPEND));	WAIT_IICACK();}inline static void IIC_MasterTx(char data){	__u32 temp;	int i;	temp=IICCON;	temp  &= (~IICCON_INTPEND);		temp |= IICCON_ACKEN;	IICDS   = data;	for(i=0;i<10;i++);                  //for setup time until rising edge of IICSCL	IICCON  = temp;	//Resumes IIC operation.//	while(!(IICCON&IICCON_INTPEND));	WAIT_IICACK();}inline static char IIC_MasterRx(int isACK){	char data;	__u32 temp;	temp=IICCON;	if(isACK){//Resumes IIC operation with ACK		temp  &= (~IICCON_INTPEND);			temp |= IICCON_ACKEN;	}	else{	//Resumes IIC operation with NOACK		temp  &= ~(IICCON_INTPEND|IICCON_ACKEN);	}	IICCON = temp;//	while(!(IICCON&IICCON_INTPEND));	WAIT_IICACK();	data = IICDS ;	return data;}inline static void IIC_MasterRxStart(char address){	__u32 temp;	temp=IICCON;	temp  &= (~IICCON_INTPEND);		temp |= IICCON_ACKEN;	IICDS   = address;	IICSTAT = IICSTAT_MODE_MR|IICSTAT_START|IICSTAT_OUTEN; //MasRx,Start, 0xb0	IICCON = temp;//	while(!(IICCON&IICCON_INTPEND));	WAIT_IICACK();}static void IIC_MasterTxStop(void){	__u32 temp;	temp=IICCON;	temp  &= (~IICCON_INTPEND);		temp |= IICCON_ACKEN;	IICSTAT = IICSTAT_MODE_MT|IICSTAT_OUTEN;                //Stop MasTx condition 0xd0	IICCON = temp;	udelay(10);                       //Wait until stop condtion is in effect.}static void IIC_MasterRxStop(void){	__u32 temp;	temp=IICCON;	temp  &= (~IICCON_INTPEND);		temp |= IICCON_ACKEN;	IICSTAT = IICSTAT_MODE_MR|IICSTAT_OUTEN;                //Stop MasRx condition 0x90	IICCON = temp;	udelay(10);                       //Wait until stop condtion is in effect.}inline static __u8 IIC_Read(char devaddr, char address){	__u8 data;	IIC_MasterTxStart(devaddr);	IIC_MasterTx(address);	IIC_MasterRxStart(devaddr|IIC_READ);	data=IIC_MasterRx(FALSE);	IIC_MasterRxStop();	return data;}inline static void IIC_Write(char devaddr, char address, __u8 data){	IIC_MasterTxStart(devaddr);	IIC_MasterTx(address);	IIC_MasterTx(data);	IIC_MasterTxStop();}inline static void IIC_ReadSerial(char devaddr, char address, __u8* pdata, int n){	if (n <=0 )		return;	n--;	IIC_MasterTxStart(devaddr);	IIC_MasterTx(address);	IIC_MasterRxStart(devaddr|IIC_READ);	for(;n>0;n--){		*pdata=IIC_MasterRx(TRUE);		pdata++;	}	*pdata=IIC_MasterRx(FALSE);	IIC_MasterRxStop();}static void IIC_WriteSerial(char devaddr, char address, __u8* pdata, int n){	if (n <=0 )		return;	IIC_MasterTxStart(devaddr);	IIC_MasterTx(address);	for(;n>0;n--){		IIC_MasterTx(*pdata);		pdata++;	}	*pdata=IIC_MasterRx(FALSE);	IIC_MasterTxStop();}#endif

⌨️ 快捷键说明

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