📄 iic.c
字号:
/**************************************************************************************************
* FILENAME
* timer.c
*
* VERSION
* 1.0
*
* DESCRIPTION
* This file contains the timer initial routine and timer ISR.
*
* DATA STRUCTURES
* None
*
* FUNCTIONS
* 1. Fun_TimerX_ISR()
* 2. Fun_TimerInitialize()
*
* HISTORY
* 10/28/2003 Ver 1.0 Created by Hank Ji
*
* REMARK
* None
*
*************************************************************************************************/
#include <stdio.h>
#include "740defs.h"
#define C_iic
#include "ist.h"
//uint8 xre;
/******************I2C 接口基本函数********************/
void delay(void)
{
nops;
nops;
nops;
}
void I_start(void)
{
SCL_DIR_OUT;
SDA_DIR_OUT;
SCL_HI;
delay();
SDA_LO;
delay();
SCL_LO;
delay();
}
void I_stop(void)
{
SDA_LO;
delay();
SCL_HI;
delay();
SDA_HI;
delay();
SCL_LO;
delay();
}
void I_init(void)
{
SCL_LO;
I_stop();
}
bool I_clock(void)
{
uint32 x;
SCL_HI;
delay();
x = SDA_INPUT;
// xre = x;
SCL_LO;
delay();
if(x == 0 )
{
return 0;
}
return 1;
}
bool I_send(uint8 I_data)
{
uint8 i,x;
for(i=0;i<8;i++)
{
x = I_data & 0x80;
if(x == 0)
{
SDA_LO;
}
else
{
SDA_HI;
}
I_data =I_data <<1;
SCL_HI;
delay();
SCL_LO;
delay();
}
delay();
SDA_DIR_IN;
delay();
if(I_clock() == 0)
{
if(SDA_INPUT == 1)
{ SDA_HI; }
else
{ SDA_LO; }
SDA_DIR_OUT;
return 1;
}
if(SDA_INPUT == 1)
{ SDA_HI; }
else
{ SDA_LO; }
SDA_DIR_OUT;
return 0;
}
uint8 I_receive(void)
{
uint8 i;
uint8 I_data = 0;
uint8 x;
SDA_DIR_IN;
for(i=0;i<8;i++)
{
I_data *= 2;
if(I_clock() == 1)
{
I_data++;
x = 1;
}
else
{
x = 0;
}
}
if(x==1)
{
SDA_HI;
}
else
{
SDA_LO;
}
SDA_DIR_OUT;
return I_data;
}
void I_Ack(void)
{
SDA_LO;
I_clock();
SDA_HI;
}
/******************I2C 接口应用函数********************/
bool E_address(uint8 Address)
{
I_start();
if(I_send(I2C_WRITE))
return (I_send(Address));
else
return 0;
}
bool E_read_byte(uint8 Address)
{
if(E_address(Address))
{
I_start();
if(I_send(I2C_READ))
{
I2C_byte = (I_receive());
SCL_HI;
delay();
SCL_LO;
delay();
I_stop();
return 1;
}
else
{
I_stop();
return 0;
}
}
else
{
I_stop();
return 0;
}
}
bool E_write_byte(uint8 Address,uint8 data)
{
if((E_address(Address))&&(I_send(data)))
{
I_stop();
Fun_delay_1ms(20);
return 1;
}
else
{
return 0;
}
}
uint8 Fun_read_status(uint8 Address)
{
if(E_address(Address))
{
return I2C_byte;
}
return 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -