- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
I2C.c
资源名称:SDK_M5661.rar [点击查看]
上传用户:hjhsjcl
上传日期:2020-09-25
资源大小:11378k
文件大小:10k
源码类别:
压缩解压
开发平台:
C++ Builder
- /*==========================================================================
- Copyright (c) 2004 ALi Corporation. All Rights Reserved
- Target File: FM
- Applying Source File : FmM5181.c
- content:
- History:
- Created by David Chiu 2004/4/27
- Modified by Dennis Shih 2006/01/16
- ==========================================================================*/
- #define _I2C_H_
- #include "TypeDef.h"
- #include "Const.h"
- #include "Reg5661.h"
- #if(FM_MODULE==2)
- #include "I2C.h"
- #include <intrins.h>
- #endif
- /*
- #include "Common.h"
- #include "UiFm.h"
- #include "I2C.h"
- #include "FmChipDrv.h"
- #if(_C_MODE_)
- #include "IconDefine.h"
- #include "OLED.h"
- #else
- #include "Lcd.h"
- #endif
- */
- /*--------------------------------------------------------------------------
- Desciption:
- Initial setting of I2C Module
- Arguments:
- void
- Global arguments:
- void
- Returns:
- void
- --------------------------------------------------------------------------*/
- #if(FM_MODULE==2)
- //////////////////////////////////////////////////////
- #define i2c_delay2()
- {
- _nop_();
- _nop_();
- }
- #define i2c_delay4()
- {
- _nop_();
- _nop_();
- }
- #define i2c_delay()
- {
- _nop_();
- _nop_();
- }
- /*
- void i2c_delay (void) // 400Khz, NEED TO DEBUG
- {
- // BYTE i;
- // for(i=0;i<1;i++)
- // {
- _nop_();
- _nop_();
- // _nop_();
- // }
- }
- */
- void i2c_start (BYTE device) i2c_large_test
- //void i2c_start (BYTE device) large
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {
- I2C_LCD_SDA_OUT();
- I2C_LCD_SCL_OUT();
- I2C_LCD_SDA_1();
- I2C_LCD_SCL_1(); i2c_delay4();
- I2C_LCD_SDA_0(); i2c_delay();
- I2C_LCD_SCL_0(); i2c_delay();
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {
- I2C_FM_SDA_OUT(); i2c_delay4();
- I2C_FM_SCL_OUT();
- I2C_FM_SDA_1();
- I2C_FM_SCL_1(); i2c_delay4();
- I2C_FM_SDA_0(); i2c_delay();
- I2C_FM_SCL_0(); i2c_delay();
- }
- #endif
- }
- void i2c_stop (BYTE device) i2c_large_test
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {
- I2C_LCD_SDA_OUT();
- I2C_LCD_SCL_OUT();
- I2C_LCD_SDA_0(); i2c_delay();
- I2C_LCD_SCL_1(); i2c_delay4();
- I2C_LCD_SDA_1(); i2c_delay();
- I2C_LCD_SCL_0(); i2c_delay();
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {
- I2C_FM_SDA_OUT();
- I2C_FM_SCL_OUT();
- I2C_FM_SDA_0(); i2c_delay();
- I2C_FM_SCL_1(); i2c_delay4();
- I2C_FM_SDA_1(); i2c_delay();
- I2C_FM_SCL_0(); i2c_delay();
- }
- #endif
- }
- #if(0)
- void init_i2c (BYTE device) i2c_large_test //main()初始化中调用
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {
- I2C_LCD_SDA_OUT();
- I2C_LCD_SCL_OUT();
- I2C_LCD_SCL_0();
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {
- I2C_FM_SDA_OUT();
- I2C_FM_SCL_OUT();
- I2C_FM_SCL_0();
- }
- #endif
- i2c_stop(device);
- }
- #endif
- void i2c_clock (BYTE device) i2c_large_test
- {
- // BYTE sample;
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {
- I2C_LCD_SCL_OUT();
- I2C_LCD_SCL_1(); i2c_delay4();
- // I2C_LCD_SDA_IN();
- // sample=I2C_LCD_SDA_RD;
- // I2C_LCD_SDA_OUT();
- I2C_LCD_SCL_0(); i2c_delay();
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {
- I2C_FM_SCL_OUT();
- I2C_FM_SCL_1(); i2c_delay4();
- // I2C_FM_SDA_IN();
- // sample=I2C_FM_SDA_RD;
- // I2C_FM_SDA_OUT();
- I2C_FM_SCL_0(); i2c_delay();
- }
- #endif
- // if (sample==0) return (0);
- // else return (1);
- // return (0);
- }
- BYTE i2c_rd_ack (BYTE device) i2c_large_test
- {
- BYTE sample;
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {
- I2C_LCD_SCL_OUT();
- I2C_LCD_SCL_1(); i2c_delay4();
- I2C_LCD_SDA_IN();
- sample=I2C_LCD_SDA_RD;
- I2C_LCD_SDA_OUT();
- I2C_LCD_SCL_0(); i2c_delay();
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {
- I2C_FM_SCL_OUT();
- I2C_FM_SCL_1(); i2c_delay4();
- I2C_FM_SDA_IN(); i2c_delay4();
- sample=I2C_FM_SDA_RD;
- I2C_FM_SDA_OUT();
- I2C_FM_SCL_0(); i2c_delay();
- }
- #endif
- if (sample==0) return (0);
- else return (1);
- // return (0);
- }
- BYTE i2c_rd_data (BYTE device) i2c_large_test
- {
- BYTE sample;
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {
- I2C_LCD_SCL_OUT();
- I2C_LCD_SCL_1(); i2c_delay4();
- // I2C_LCD_SDA_IN();
- sample=I2C_LCD_SDA_RD;
- // I2C_LCD_SDA_OUT();
- I2C_LCD_SCL_0(); i2c_delay();
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {
- I2C_FM_SCL_OUT();
- I2C_FM_SCL_1(); i2c_delay4();
- // I2C_FM_SDA_IN();
- sample=I2C_FM_SDA_RD; i2c_delay4();
- // I2C_FM_SDA_OUT();
- I2C_FM_SCL_0(); i2c_delay();
- }
- #endif
- if (sample==0) return (0);
- else return (1);
- // return (0);
- }
- BYTE i2c_send (BYTE device, BYTE i_data) i2c_large_test
- {
- BYTE i;
- for (i=0;i<8;i++)
- {
- if (i_data&0x80)
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_1();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_1();}
- #endif
- }
- else
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_0();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_0();}
- #endif
- }
- i_data=i_data<<1;
- i2c_clock(device);
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_1();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_1();}
- #endif
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_IN();} //请求ACK
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_IN();}
- #endif
- return (!i2c_rd_ack(device));
- }
- BYTE i2c_receive (BYTE device) i2c_large_test
- {
- BYTE i,i_data=0;
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_IN();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_IN();}
- #endif
- for (i=0;i<8;i++)
- {
- i_data*=2;
- if (i2c_rd_data(device)) i_data++;
- }
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_OUT();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_OUT();}
- #endif
- return(i_data);
- }
- void i2c_ack (BYTE device) i2c_large_test
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_0();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_0();}
- #endif
- i2c_clock(device);
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_1();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_1();}
- #endif
- }
- void i2c_nack (BYTE device) i2c_large_test
- {
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_1();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_1();}
- #endif
- i2c_clock(device);
- #if ((_PM_FM_)|(_PM_INIT_))
- if (device==I2C_LCD)
- #endif
- {I2C_LCD_SDA_0();}
- #if ((_PM_FM_)|(_PM_INIT_))
- else
- {I2C_FM_SDA_0();}
- #endif
- }
- BYTE i2c_address(BYTE device, BYTE addr) i2c_large_test
- {
- i2c_start(device);
- if (i2c_send(device, addr))
- return (1);
- else
- return (0);
- }
- BYTE i2c_wr(BYTE device, BYTE sla_addr, BYTE length, BYTE * buff) i2c_large_test
- {
- BYTE i;
- if (i2c_address(device, sla_addr))
- {
- for (i=0;i<length;i++)
- {
- if (i2c_send(device, *buff))
- {
- buff++;
- // i2c_feeddog();
- }
- else
- {
- i2c_stop(device);
- return(0);
- }
- }
- i2c_stop(device);
- return(1);
- }
- else
- {
- i2c_stop(device);
- return (0);
- }
- }
- BYTE i2c_rd(BYTE device, BYTE sla_addr, BYTE length, BYTE * buff) i2c_large_test
- {
- BYTE i;
- if (i2c_address(device, sla_addr|0x01))
- {
- for(i=0;i<length;i++)
- {
- *(buff++)=i2c_receive(device);
- if (i==(length-1))
- {
- i2c_nack(device);
- i2c_stop(device);
- }
- else i2c_ack(device);
- // i2c_feeddog();
- }
- return(1);
- }
- else
- {
- i2c_stop(device);
- return (0);
- }
- }
- #if(0)
- BYTE i2c_rd1(BYTE device, BYTE sla_addr, BYTE length, BYTE * buff) i2c_large_test
- {
- BYTE i;
- sla_addr=12;
- if (i2c_address(device, sla_addr|0x01))
- {
- //for(i=0;i<length;i++)
- for(i=0;i<2;i++)
- {
- *(buff++)=i2c_receive(device);
- if (i==(length-1))
- {
- i2c_nack(device);
- i2c_stop(device);
- }
- else i2c_ack(device);
- // i2c_feeddog();
- }
- return(1);
- }
- else
- {
- i2c_stop(device);
- return (0);
- }
- }
- #endif
- #if (_PEDOMETER_Mode_)
- void I2cInit(void)
- {
- obSYSSOFTRSTCTRL2 |= 0x04; // Disable I2C soft reset
- obCLKI2CMCTRL = 0xD0; // Enable I2C Clock 12MHz
- // obCLKI2CMCTRL =0xD8; //Dennis Shih 2006/01/26
- // obCLKI2CMDIVF=0x00; //Dennis Shih 2006/01/26
- obMODSEL2 |= 0x08; // I2C Mode Select
- obREADYENH |= 0x08; // I2C I/O Ready
- }
- bit I2cWaitBusy(void)
- {
- #define I2C_TIME_OUT 0xFF
- BYTE bRetry=I2C_TIME_OUT;
- while(obI2CSERSTS&0x80)
- {
- // bRetry--;
- // if(bRetry==0)
- // return FALSE;
- }
- return TRUE;
- }
- #endif
- #else //#if(FM_MODULE==2)
- #if (_PM_FM_|_PM_MPTEST_|_PEDOMETER_Mode_)
- void I2cInit(void)
- {
- obSYSSOFTRSTCTRL2 |= 0x04; // Disable I2C soft reset
- obCLKI2CMCTRL = 0xD0; // Enable I2C Clock 12MHz
- // obCLKI2CMCTRL =0xD8; //Dennis Shih 2006/01/26
- // obCLKI2CMDIVF=0x00; //Dennis Shih 2006/01/26
- obMODSEL2 |= 0x08; // I2C Mode Select
- obREADYENH |= 0x08; // I2C I/O Ready
- }
- #endif //(_PM_FM_|_PM_MPTEST_)
- #if (_PM_FM_|_PM_MPTEST_|_PEDOMETER_Mode_)
- bit I2cWaitBusy(void)
- {
- #define I2C_TIME_OUT 0xFF
- BYTE bRetry=I2C_TIME_OUT;
- while(obI2CSERSTS&0x80)
- {
- // bRetry--;
- // if(bRetry==0)
- // return FALSE;
- }
- return TRUE;
- }
- #endif //(_PM_FM_|_PM_MPTEST_)
- #endif