📄 iic_diver.c
字号:
#include "Spmc70_regs.h"
#include "mcMACRO.h"
#define Daly_Max 50
#define IIC_Port P_IOC_Data
#define IIC_Port_Dir P_IOC_Dir
#define IIC_Port_Attrib P_IOC_Attrib
#define IIC_SDA IIC_Port->B.bit14
#define IIC_SCL IIC_Port->B.bit15
#define IIC_SDA_Dir IIC_Port_Dir->B.bit14
#define IIC_SCL_Dir IIC_Port_Dir->B.bit15
#define IIC_SDA_Attrib IIC_Port_Attrib->B.bit14
#define IIC_SCL_Attrib IIC_Port_Attrib->B.bit15
//****************************************************************************************************
// IIC初始化程序 void IIC_Init(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Init(void)
{
IIC_SCL_Dir = 1;
IIC_SDA_Dir = 1;
IIC_SDA_Attrib = 1;
IIC_SCL_Attrib = 1;
IIC_SDA = 0;
IIC_SCL = 0;
}
void Daly_Time(int Data)
{
while(Data>0)
{
Data --;
}
}
void Work_daly(int Time)
{
int i;
while(Time>0)
{
i = 25000;
while(i>0)
{
i--;
}
Time --;
}
}
//****************************************************************************************************
// IIC总线启动 void IIC_Start(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Start(void)
{
int i;
IIC_SDA = 1;
IIC_SCL = 1;
Daly_Time(Daly_Max);
IIC_SDA = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SCL = 0;
Daly_Time(Daly_Max);
}
//****************************************************************************************************
// IIC总线停止 void IIC_Stop(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Stop(void)
{
int i;
IIC_SDA = 0;
IIC_SCL = 1;
Daly_Time(Daly_Max);
IIC_SDA = 1;
Daly_Time(Daly_Max);
IIC_SCL = 0;
IIC_SDA = 0;
}
//****************************************************************************************************
// 向IIC总线上发送应答信号 void IIC_TX_ACK(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_TX_ACK(void)
{
int i;
IIC_SDA = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SCL = 1;
Daly_Time(Daly_Max);
IIC_SCL = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SDA = 1;
Daly_Time(Daly_Max);
}
//****************************************************************************************************
// 向IIC总线上发送非应答信号 void IIC_TX_NACK(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_TX_NACK(void)
{
int i;
IIC_SDA = 1;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SCL = 1;
Daly_Time(Daly_Max);
IIC_SCL = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SDA = 0;
Daly_Time(Daly_Max);
}
//****************************************************************************************************
// 校验IIC总线上的应答信号 int IIC_CRC_ACK(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
UInt16 IIC_CRC_ACK(void)
{
int Temp,i;
IIC_SDA_Dir = 0; //切换为输入状态
IIC_SCL = 1;
Daly_Time(Daly_Max);
//if(IIC_SDA) Temp = 1;
//else Temp = 0;
while(IIC_SDA);
IIC_SCL = 0;
IIC_SDA_Dir = 1;
Daly_Time(Daly_Max);
return(Temp);
}
//****************************************************************************************************
// 向IIC总线上写一个字节 void IIC_Write_Byte(int Data)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Write_Byte(UInt16 Data)
{
int Temp,i;
for(Temp=0;Temp<8;Temp++)
{
if((Data&0x0080)>0) IIC_SDA = 1;
else IIC_SDA = 0;
IIC_SCL = 1;
Daly_Time(Daly_Max);
IIC_SCL = 0;
Daly_Time(Daly_Max);
Data = Data << 1;
}
IIC_SDA = 0;
Daly_Time(Daly_Max);
}
//****************************************************************************************************
// 在IIC总线上读取一个字节的数据 int IIC_Read_Byte(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
UInt16 IIC_Read_Byte(void)
{
UInt16 Temp,Data;
int i;
IIC_SDA_Dir = 0;
for(Temp = 0;Temp < 8;Temp ++)
{
IIC_SCL = 1;
Daly_Time(Daly_Max);
Data = Data << 1;
if(IIC_SDA>0) Data += 1;
IIC_SCL = 0;
Daly_Time(Daly_Max);
}
IIC_SDA_Dir = 1;
Daly_Time(Daly_Max);
return(Data&0x00ff);
}
//****************************************************************************************************
// 写任意一个字节 void IIC_Write_B(UInt16 ADDR,UInt16 Data)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Write_B(UInt16 ADDR,UInt16 Data)
{
IIC_Start();
IIC_Write_Byte(0x00a0);
IIC_CRC_ACK();
IIC_Write_Byte(ADDR>>8);
IIC_CRC_ACK();
IIC_Write_Byte(ADDR);
IIC_CRC_ACK();
IIC_Write_Byte(Data&0x00ff);
IIC_CRC_ACK();
IIC_Stop();
}
//****************************************************************************************************
// 读任意一个字节 void IIC_Read_B(UInt16 ADDR)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
UInt16 IIC_Read_B(UInt16 ADDR)
{
UInt16 Temp;
IIC_Start();
IIC_Write_Byte(0x00a0);
IIC_CRC_ACK();
IIC_Write_Byte((ADDR>>8)&0x00ff);
IIC_CRC_ACK();
IIC_Write_Byte(ADDR&0x00ff);
IIC_CRC_ACK();
IIC_Start();
IIC_Write_Byte(0x00a1);
IIC_CRC_ACK();
Temp = IIC_Read_Byte();
IIC_TX_NACK();
IIC_Stop();
return(Temp);
}
//****************************************************************************************************
// 向IIC总线上写N个字节的数据 void IIC_Write_NByte(UInt16 ADDR,UInt16 *Data,int Number)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Write_NByte(UInt16 ADDR,UInt16 *Data,int Number)
{
IIC_Start();
IIC_Write_Byte(0x00a0);
IIC_CRC_ACK();
IIC_Write_Byte((ADDR>>8)&0x00ff);
IIC_CRC_ACK();
IIC_Write_Byte(ADDR&0x00ff);
IIC_CRC_ACK();
while(1)
{
IIC_Write_Byte((*Data)>>8);
IIC_CRC_ACK();
Number --;
if(Number<=0) break;
IIC_Write_Byte(*Data);
IIC_CRC_ACK();
Number --;
if(Number<=0) break;
Data ++;
ADDR ++;
if((ADDR&0x003f) == 0)
{//翻页处理
Work_daly(10); //等10ms
IIC_Start(); //写新的地址
IIC_Write_Byte(0x00a0);
IIC_CRC_ACK();
IIC_Write_Byte((ADDR>>8)&0x00ff);
IIC_CRC_ACK();
IIC_Write_Byte(ADDR&0x00ff);
IIC_CRC_ACK();
}
}
IIC_Stop();
}
//****************************************************************************************************
// 在IIC总线上读取N个字节的数据 void IIC_Read_NByte(UInt16 ADDR,UInt16 *Data,int Number)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Read_NByte(UInt16 ADDR,UInt16 *Data,int Number)
{
IIC_Start();
IIC_Write_Byte(0x00a0);
IIC_CRC_ACK();
IIC_Write_Byte((ADDR>>8)&0x00ff);
IIC_CRC_ACK();
IIC_Write_Byte(ADDR&0x00ff);
IIC_CRC_ACK();
IIC_Start();
IIC_Write_Byte(0x00a1);
IIC_CRC_ACK();
while(1)
{
*Data = (IIC_Read_Byte()<<8)&0xff00;
Number --;
if(Number<=0) break;
IIC_TX_ACK();
(*Data) += (IIC_Read_Byte()&0x00ff);
Number --;
if(Number<=0) break;
IIC_TX_ACK();
Data ++;
}
IIC_TX_NACK();
IIC_Stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -