iic_diver.c
来自「基于SPMC75的变频电机驱动例子,相当于一个简单的变频器. 望对变频器开发的工」· C语言 代码 · 共 315 行
C
315 行
#include "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Option.h"
void Daly_Time(int Time);
//****************************************************************************************************
// 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_IIC(int Data)
{
while(Data>0)
{
Data --;
}
}
//****************************************************************************************************
// IIC总线启动 void IIC_Start(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Start(void)
{
IIC_SDA = 1;
IIC_SCL = 1;
Daly_IIC(Daly_Max);
IIC_SDA = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SCL = 0;
Daly_IIC(Daly_Max);
}
//****************************************************************************************************
// IIC总线停止 void IIC_Stop(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Stop(void)
{
IIC_SDA = 0;
IIC_SCL = 1;
Daly_IIC(Daly_Max);
IIC_SDA = 1;
Daly_IIC(Daly_Max);
IIC_SCL = 0;
IIC_SDA = 0;
}
//****************************************************************************************************
// 向IIC总线上发送应答信号 void IIC_TX_ACK(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_TX_ACK(void)
{
IIC_SDA = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SCL = 1;
Daly_IIC(Daly_Max);
IIC_SCL = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SDA = 1;
Daly_IIC(Daly_Max);
}
//****************************************************************************************************
// 向IIC总线上发送非应答信号 void IIC_TX_NACK(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_TX_NACK(void)
{
IIC_SDA = 1;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SCL = 1;
Daly_IIC(Daly_Max);
IIC_SCL = 0;
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
IIC_SDA = 0;
Daly_IIC(Daly_Max);
}
//****************************************************************************************************
// 校验IIC总线上的应答信号 int IIC_CRC_ACK(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
UInt16 IIC_CRC_ACK(void)
{
int Temp;
IIC_SDA_Dir = 0; //切换为输入状态
IIC_SCL = 1;
Daly_IIC(Daly_Max);
//if(IIC_SDA_in) Temp = 1;
//else Temp = 0;
while(IIC_SDA_in);
IIC_SCL = 0;
IIC_SDA_Dir = 1;
Daly_IIC(Daly_Max);
return(Temp);
}
//****************************************************************************************************
// 向IIC总线上写一个字节 void IIC_Write_Byte(int Data)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
void IIC_Write_Byte(UInt16 Data)
{
int Temp;
for(Temp=0;Temp<8;Temp++)
{
if((Data&0x0080)>0) IIC_SDA = 1;
else IIC_SDA = 0;
IIC_SCL = 1;
Daly_IIC(Daly_Max);
IIC_SCL = 0;
Daly_IIC(Daly_Max);
Data = Data << 1;
}
IIC_SDA = 0;
Daly_IIC(Daly_Max);
}
//****************************************************************************************************
// 在IIC总线上读取一个字节的数据 int IIC_Read_Byte(void)
// 设计者: 牟联树
// 描 述:
// 日 期: 2004.7.19
// 版本号: 1.0
//****************************************************************************************************
UInt16 IIC_Read_Byte(void)
{
UInt16 Temp,Data;
IIC_SDA_Dir = 0;
for(Temp = 0;Temp < 8;Temp ++)
{
IIC_SCL = 1;
Daly_IIC(Daly_Max);
Data = Data << 1;
if(IIC_SDA_in > 0) Data += 1;
IIC_SCL = 0;
Daly_IIC(Daly_Max);
}
IIC_SDA_Dir = 1;
Daly_IIC(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(0xa0);
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();
Daly_Time(20);
}
//****************************************************************************************************
// 读任意一个字节 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 ++;
}
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 + =
减小字号Ctrl + -
显示快捷键?