⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic_diver.c

📁 基于SPMC75的NNAD_Flash K9F1208的驱动程式序,对一些需要存海量数据的单片机应用场合有用.
💻 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 + -