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

📄 viic.c

📁 适用与ARM7/ARM9.一个用GPIO模拟IIC的驱动程序.本人已经验证并使用.
💻 C
字号:
/******************************************************************************//* SCCS: %Z% Name: %M% Date US: %G% %U% Ver.: %I% *//******************************************************************************//*F(***************************************************************************  * File name : VIIC3kid.c * Project : Handler Keyboard * Module : VIICD * Date : (US) 10/02/98 * Version : V.0.0.1 * Compiler name and release(s) : *----------------------------------------------------------------------------*  *----------------------------------------------------------------------------*  *                                    DESCRIPTION * * This file contains functions used for the interface to the KID keyboard driver *  *----------------------------------------------------------------------------*  *----------------------------------------------------------------------------*  *                           FUNCTIONS DEFINED IN THIS FILE *----------------------------------------------------------------------------*  * Name                         | Object *----------------------------------------------------------------------------*  *  * *----------------------------------------------------------------------------*  *----------------------------------------------------------------------------*  *                                    EVOLUTION *----------------------------------------------------------------------------*  * Date     | Author         | Arnb     | Description *----------------------------------------------------------------------------*  * 03.11.06 | Huwei      |          | Initial version *----------------------------------------------------------------------------*  *----------------------------------------------------------------------------****************************************************************************)F*//* #*/#ifndef VIIC_C#define VIIC_C/*inc - INCLUDE---------------*/#include "zr3453.h"#define VIIC_BIT_LOW DIN_PORT_LOW#define VIIC_BIT_HIGH DIN_PORT_HIGH#define RETRY_TIMES 10#define GPIO_SCL GPIO_A24#define GPIO_SDA GPIO_A26#define GPIO_SDA GPIO_A26void I2C_SDA_Mode(u8 v_mode){    if(v_mode)    {                                                        din2_37SetGpioDir(GPIO_SDA, DIN_PORT_OUTP);       }    else    {        din2_37SetGpioDir(GPIO_SDA, DIN_PORT_INP);       }}u8 I2C_SDA_Read(void){    return din2_36Gpio(GPIO_SDA,DIN_PORT_GET_VALUE);  }void I2C_SDA_Output(u8 value){    if(value)    {                                                        din2_36Gpio(GPIO_SDA,DIN_PORT_HIGH);      }    else    {        din2_36Gpio(GPIO_SDA,DIN_PORT_LOW );      }}void I2C_SCL_Output(u8 value){    if(value)    {                                                        din2_36Gpio(GPIO_SCL,DIN_PORT_HIGH);      }    else    {        din2_36Gpio(GPIO_SCL,DIN_PORT_LOW );      }}//static u8 Flag_Timeout;void I2C_Init(){		I2C_SDA_Output(1);	I2C_SCL_Output(1);	}void I2C_Wait(void){     u16 i;	     // for(i=0;i<0x1000;i++);     for(i=0;i<200;i++);}void I2C_Start(void) {    I2C_SDA_Output(1);    I2C_SCL_Output(1);    I2C_Wait();    I2C_SDA_Output(0);    I2C_Wait();    I2C_SCL_Output(0);}void I2C_Stop(void) {    I2C_SDA_Output(0);    I2C_Wait();    I2C_SCL_Output(1);    I2C_Wait();    I2C_SDA_Output(1);}u8 I2C_Send_Byte(u8 bytedata) //sent bytedata to slave device{    u8 i;    u8 ack;        for (i = 0; i < 8; i++)  //        {              if (bytedata & 0x80)               {                     I2C_SDA_Output(1);              }              else              {                    I2C_SDA_Output(0);              }              bytedata <<= 1;              I2C_Wait();                            I2C_SCL_Output(1);              I2C_Wait();              I2C_SCL_Output(0);              I2C_Wait();        }                I2C_SDA_Output(1);  //release        I2C_Wait();                I2C_SDA_Mode(0);	        I2C_SCL_Output(1);  //Output the ninth high pulse         I2C_Wait();        ack = I2C_SDA_Read();  //Recieve Ack        I2C_SDA_Mode(1);	        I2C_SCL_Output(0);        I2C_Wait();                 return ack;		 }u8 I2C_Receive_Byte(void)  //read  bytedata from slave device{    u8 i;    u8 bytedata = 0;    u8 temp;	    I2C_SDA_Mode(0);	    for ( i = 0; i < 8; i++)    {        I2C_SCL_Output(1);        I2C_Wait();        bytedata <<= 1;        temp = I2C_SDA_Read();         if (temp)        	 bytedata |= 0x01;         	         I2C_SCL_Output(0);        I2C_Wait();    }    I2C_SDA_Mode(1);		    return bytedata;}void Send_Ack(u8 ack) //send ack(1 or 0) to slave device:ACK=0.NON-ACK=1{    I2C_SDA_Output(ack);    I2C_SCL_Output(1);    I2C_Wait();    I2C_SCL_Output(0);}u8 I2C_Byte_Write(u8 device_ID,u8 address,u8 bytedata){       u8 i,temp;    u8 ack;    //Flag_Timeout = 1;    for(i = 0; i < RETRY_TIMES; i++)  //time out,retry    {        I2C_Start();        ack = I2C_Send_Byte(device_ID);        if (ack)        {                I2C_Stop();                continue;        }          ack = I2C_Send_Byte(address);        if (ack)        {                I2C_Stop();                continue;        }        ack = I2C_Send_Byte(bytedata);        if (ack)        {                I2C_Stop();                continue;        }                I2C_Stop();        //Flag_Timeout = 0;        if(0 == ack)	 { 	     break;        }    }    I2C_Wait();     return ack;}u8 I2C_Byte_Read(u8 device_ID,u8 address){       u8 bytedata;    I2C_Start();    I2C_Send_Byte(device_ID);    I2C_Send_Byte(address);    I2C_Start();    I2C_Send_Byte(device_ID+1);    bytedata = I2C_Receive_Byte();    Send_Ack(1);    I2C_Stop();        return bytedata;}u16 I2C_Short_Read(u8 device_ID,u8 address){       u16 ret_data,data1,data2;    I2C_Start();    I2C_Send_Byte(device_ID);    I2C_Send_Byte(address);    I2C_Start();    I2C_Send_Byte(device_ID+1);    data1 = I2C_Receive_Byte();    Send_Ack(1);    data2 = I2C_Receive_Byte();    Send_Ack(1);        I2C_Stop();         ret_data = (data1<<8)+data2;    return ret_data;}u8 I2C_Short_Write(u8 device_ID,u8 address,u16 data){       u8 i,data1,data2;    u8 ack;	data1 = data & 0xff;	data2 = (data & 0xff00)>>8;	    //Flag_Timeout = 1;    I2C_Start();    ack = I2C_Send_Byte(device_ID);    if (ack)    {        I2C_Stop();        return 0;    }      ack = I2C_Send_Byte(address);    if (ack)    {      	I2C_Stop();    	return 0;  	}	ack = I2C_Send_Byte(data2);    if (ack)	{		I2C_Stop();	    return 0;    }        ack = I2C_Send_Byte(data1);    if (ack)	{		I2C_Stop();	    return 0;    }            I2C_Stop();         return 1;   }////////////////////////////////////////           for test               ///////////////////////////////////////#define I2C_SLAVE_ADDRESS 0x24void I2C_Test(){	int i,ret;		I2C_Init();		I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x00,0x54);	for(i = 0; i < 50; i++);			I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x01,0x70);	for(i = 0; i < 50; i++);		I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x02,0xA0);	for(i = 0; i < 50; i++);		I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x04,0x03);	for(i = 0; i < 50; i++);		I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x09,0x91);	for(i = 0; i < 50; i++);		I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x0A,0x18);	for(i = 0; i < 50; i++);			I2C_Byte_Write(I2C_SLAVE_ADDRESS,0x0F,0x09);	for(i = 0; i < 50; i++);		}#endif

⌨️ 快捷键说明

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