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

📄 zz11_i2ctime.c

📁 《dsPIC通用数字信号控制器原理及应用》源码
💻 C
字号:
/************************************************
** 功能描述:I2C应用,PCF8583读写程序**
************************************************/
#include "p30f6014.h"
int failmemory[40];
unsigned int WriteTable[16]={0x00,0x00,0x22,0x13,0x00,0x00,0x00,0x00,
                             0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned int ReadTable[16];
unsigned int ControlByteW=0xa2; //控制字:写准备(器件地址001)
unsigned int ControlByteR=0xa3; //控制字:读准备(器件地址001)
unsigned int AddressH=0x00;  //数据地址高7位
unsigned int AddressL=0x00;  //数据地址低8位
unsigned char table[10]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned long int i = 0;

void initial()
{
	INTCON1 = 0x0000;	
    INTCON2 = 0x0000;		//关闭所有中断
    I2CCONbits.I2CEN = 1; 	//启动I2C模块
    I2CBRG = 0x064;         //I2C波特率
   
    TRISG=0xfdff;			//RG9设置为输出
	TRISF=0xfebf;			//SDO,SCK(RF6,RF8)引脚为输出
    SPI1CON = 0x0060;       //配置SPI模块,master/8位方式
    SPI1STATbits.SPIEN =1;  //启动SPI模块	
}   

void pagewrite()
{ 
    I2CCONbits.SEN = 1;           //发送启动位
    while(I2CCONbits.SEN==1){}    //等待启动操作完成
    I2CTRN = ControlByteW;           //发送控制字:写准备
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
    I2CTRN = AddressH;  
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
	I2CTRN = AddressL;   
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
    for (i=0;i<16;i++)
	{
		I2CTRN = WriteTable[i];
        while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
    }
    I2CCONbits.PEN = 1;          //发送停止位
    while(I2CCONbits.PEN==1){}   //等待停止操作完成    
}

void pageread()
{  
    I2CCONbits.SEN = 1;            //发送启动位                  
    while(I2CCONbits.SEN == 1){}   //等待启动操作完成  
    I2CTRN = ControlByteW;           //发送控制字:写准备
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
    I2CTRN = AddressH;  
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
	I2CTRN = AddressL;   
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
    I2CCONbits.RSEN = 1;             //发送重启动位
    while(I2CCONbits.RSEN==1){}      //等待重启动操作完成
    I2CTRN = ControlByteR;           //发送控制字:读准备
    while(I2CSTATbits.TRSTAT==1){}   //等待发送完成
    for (i=0;i<16;i++)
	{ 
        I2CCONbits.RCEN = 1;         //接收数据使能   
        while(I2CSTATbits.RBF==0){}
        ReadTable[i] = I2CRCV;
        I2CCONbits.ACKDT = 0;
        if (i==15)
        	I2CCONbits.ACKDT = 1;	 //最后一字节则不发ACK 
        I2CCONbits.ACKEN = 1;   
        while(I2CCONbits.ACKEN==1){}
    }   
    I2CCONbits.PEN = 1;          //发送停止位
    while(I2CCONbits.PEN==1){}   //等待停止操作完成  
}


int main()
{
	while (1)
    {
    	initial();					//初始化
    	//pagewrite();
    	//for (i=0;i<650000;i++){}     //页写操作后的等待
    	pageread(); 

		PORTGbits.RG9=0;		//LACK送低电平,为锁存做准备 
        i = (ReadTable[3]&0x00f0)>>4;
	    SPI1BUF=table[i];                
		while(SPI1STATbits.SPITBF==1){}
        i = ReadTable[3]&0x000f;
	    SPI1BUF=table[i];	             
		while(SPI1STATbits.SPITBF==1){}
        SPI1BUF=0xbf;	
		while(SPI1STATbits.SPITBF==1){}
        i = (ReadTable[2]&0x00f0)>>4;
	    SPI1BUF=table[i];	
		while(SPI1STATbits.SPITBF==1){}
        i = ReadTable[2]&0x000f;
	    SPI1BUF=table[i];	
		while(SPI1STATbits.SPITBF==1){}
        SPI1BUF=0xbf;	
		while(SPI1STATbits.SPITBF==1){}
        i = (ReadTable[1]&0x00f0)>>4;
	    SPI1BUF=table[i];	
		while(SPI1STATbits.SPITBF==1){}
        i = ReadTable[1]&0x000f;
	    SPI1BUF=table[i];	
		while(SPI1STATbits.SPITBF==1){} 
        SPI1BUF=0xbf;	
		while(SPI1STATbits.SPITBF==1){} 
        PORTGbits.RG9=1;	    //给锁存信号
        for (i=0;i<100;i++){}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -