?? viic.c
字號(hào):
/******************************************************************************//* 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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -