📄 iic.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 + -