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 + -
显示快捷键?