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

📄 i2ctestmaster.c

📁 pic单片机作为I2C从机的通讯程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*----filename:CT_Test_V1.0-------*/
/*----version:V1.0---------------*/
/*----jchaodong-----------------*/
/*----2008.04.15---------------*/
//程序中接收数据时还应加上定时器判断数据是否接收完成

#define SDA_Derection TRISA2
#define SCL_Derection TRISC2
#define SDA        RA2
#define SCL        RC2

#define Idle 0
#define buf1_len 30
#define buf2_len 15
#define buf3_len 2
#define Node_Addr 0x00

#include <htc.h>
#include <pic.h>
#include <pic16f685.h>
//---------CONFIGbits,important------------//
__CONFIG(HS&WDTEN&PWRTDIS&MCLREN&UNPROTECT);

//---------variable declare---------------//
unsigned char State=0;

unsigned char I2C_Buff[buf1_len]={0};
unsigned char Buffer2[buf2_len]={"CT_TEST_V1.0"};
unsigned char Ad_Buffer[buf3_len];
unsigned char buff[2]={0x43,0x54};
bank2 unsigned char I2C_ptr=0;
bank2 unsigned char URT_ptr=0;
bank2 unsigned int  second10ms=0;
bank2 unsigned char second=0;
bank2 unsigned char Rx_Start=0;
bank2 unsigned char Rx_Over=0;
bank2 unsigned char Ad_Over=0;
bank2 unsigned char I2c_Rd_Over=0;
bank2 unsigned char I2c_Wr_Start=0;
bank2 unsigned char I2c_Wr_Over=0;

//---------for i2c
bank2 unsigned char I2C_Ack=0;
unsigned char test_i=0;
//-------function declare---------//
void delayus(unsigned char);
void delayms(unsigned char);
//-------------------------------
void Slave_I2C_Initial(void);
void uart_initial(void);
void ad_initial(void);
void timer0_initial(void);
void timer1_initial(void);
void device_initial(void);
//-------------------------------
void interrupt isf(void);
void i2c_service(void);
void Write_I2c(unsigned char);
void uart_send_byte(unsigned char);
void uart_send_data(unsigned char *,unsigned char);
void ad_test(void);
void pulse_test(void);
//-------------------------------
void ad_deal_service(void);
void uart_deal_service(void);
void i2c_rd_deal(void);
void i2c_wr_deal(void);



//--------
void I2C_Start(void);
void I2C_Stop(void);
unsigned char I2C_CheckAcK(void);
void I2C_SendB(unsigned char);
unsigned char I2C_RceB(void);
void I2C_Ackn(unsigned char);
unsigned char Send_Nbyte(unsigned char,unsigned char*);
unsigned char Read_Nbyte(unsigned char);
//-------------------------------
void main(void)
{
    unsigned char i,jcd;
    unsigned char temp;
    device_initial();
    delayms(100);
    delayms(100);
    delayms(100);
    delayms(100);
    //uart_send_data(Buffer2,12);
    while(1)
    {
        
         I2C_Stop();
        {
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        delayms(100);
        }
        URT_ptr=0;
       // I2C_Stop();
       /*
        I2C_Start();
        I2C_SendB(0x03);
        
        if(!I2C_Ack)
            RC0=0;
        else 
            RC0=1;
       
        delayus(12);
        jcd=I2C_RceB();
        I2C_Ackn(0);
        for(i=0;i<9;i++)
        {
           delayus(20);//20
           I2C_Buff[i]=I2C_RceB();
           I2C_Ackn(0);
           
        }
        delayus(20);
        I2C_Buff[9]=I2C_RceB();
        I2C_Ackn(1);
        I2C_Stop();
        uart_send_data(I2C_Buff,10);
        */
        jcd=Read_Nbyte(15);
        if(jcd)
        {    
            if((I2C_Buff[0]==0x68)&&(I2C_Buff[14]==0x16))
            {
                temp=0;
                for(i=1;i<13;i++)
                {
                    temp+=I2C_Buff[i];
                }
                if(temp==I2C_Buff[13])
                {
                    uart_send_data(I2C_Buff,15);
                }
            }
            /*
            else
            {
                 I2C_Stop();
                 jcd=Read_Nbyte(15);
                 uart_send_data(I2C_Buff,15);
            }*/
            //Send_Nbyte(15,I2C_Buff);
        }  
        else 
        {
            I2C_Stop();
        }
        NOP();
        NOP();
        NOP();
        NOP();
       // delayms(100);
        //Send_Nbyte(URT_ptr,Buffer2);
        Send_Nbyte(12,Buffer2);
        CLRWDT();
    }
}

//---------name:Slave_I2C_Initial---------//
//input: none
//output:none
//---------function :initial i2c----------//
void Slave_I2C_Initial(void)
{

    PORTB=0x00;
    PIR1=0x00;
    // for slave i2c mode,both input
	TRISB4=1;
    TRISB6=1;  
	// slave i2c mode,7 bit address// enable i2c and clock
	SSPCON=0x36;
    // set address for the device
	SSPADD=Node_Addr;
	// enable i2c and clock
//	SSPEN=1;
//	CKP=1;
	// enable interrupt
	SSPIE=1;
    
}
//---------name:interrupt isf---------//
//input: none
//output:none
//----function :interrupt service----//

void interrupt isf(void)
{
    
    CLRWDT();
    if(TMR1IE&&TMR1IF)
    {
        TMR1IF=0;
        TMR1L=0xD8;
        TMR1H=0xF1;
        second10ms++;
        if(second10ms%100==0)
        {
            //second10ms=0;
            second++;
            if(second%2==1)
            {
               //RC0=1;
            }
            else 
               RC0=0;
        }
       
      
        if(Rx_Start==1)
        {
            if(second10ms>3)
            {
                Rx_Over=1;
            }
        }
        if(I2c_Wr_Start==1)
        {
            if(second10ms>3)
            {
                I2c_Wr_Over=1;
            }
        }
    }
// I2C service
	if(SSPIE&&SSPIF)
	{
		SSPIF=0;
        //i2c_service();
	}
// uart service
    if(RCIE&&RCIF)
    {
               
        second10ms=0;
        if(Rx_Start==0)
        {
            Rx_Start=1;
            URT_ptr=0;
        }
        Buffer2[URT_ptr%buf2_len]=RCREG;
        URT_ptr++;
        if(URT_ptr>buf2_len)
        {
            URT_ptr=0;
        }
// if error occur
        if(FERR==1 || OERR==1)  
        {
            CREN=0;
            CREN=1;
        }
    }
 // A/D service  
    if(ADIE&&ADIF)
    {
        ADIF=0;
        Ad_Buffer[0]=ADRESH;
        Ad_Buffer[1]=ADRESL;
        Ad_Over=1;
    }
}

//---------name:i2c_service-----------//
//input: none
//output:none
//----function:i2c interrupt service--//
void i2c_service(void)
{
    //CLRWDT();   
	if(START==1 && RW==0 && DA==0 && BF==1)
	{
		State=1;        
	}
	if(START==1 && RW==0 && DA==1 && BF==1)
	{
		State=2;
	}
	if(START==1 && RW==1 && DA==0 && BF==0)
	{ 
		State=3;
	}
	if(START==1 && RW==1 && DA==1 && BF==0)
	{
		State=4;
	}
	if(START==1 && RW==0 && DA==1 && BF==0)
	{
		State=5;
	}
	if(SSPOV==1)
	{
		SSPOV=0;
	}
    
	switch(State)
	{
		case 1: //master write data,this byte is address
		{
			I2C_Buff[0]=SSPBUF;
            I2C_ptr=0;
			break;
		}
		case 2://master write data,this byte is data
		{
			I2C_Buff[I2C_ptr%buf1_len]=SSPBUF;
            I2C_ptr++;
			if(I2C_ptr>buf1_len)
			{
				I2C_ptr=0;
			}
            if(I2c_Wr_Start==0)
            {
                I2c_Wr_Start=1;
            }
            second10ms=0;
            break;
		}
		case 3://master read data,this byte is data
        {
            I2C_ptr=0;
            Write_I2c(I2C_Buff[I2C_ptr%buf1_len]);
            I2C_ptr++;
            break;
        }
		case 4://master read data,this byte is data
		{
			//CKP=0;
			Write_I2c(I2C_Buff[I2C_ptr]);
            I2C_ptr++;
            if(I2C_ptr>buf1_len)
            {
                I2C_ptr=0;
            }
			break;
		}
		case 5:
		{
			I2c_Rd_Over=1;
            break;
		}
		default:
        {
            NOP();//something wrong happens
            while(1);// wait for watch dog reset
        }
		
	}
    State=0;
    CLRWDT();
}
//---------name:Write_I2c---------//
//input: data want to send via I2C
//output:none
//--function :send data via i2c--//
void Write_I2c(unsigned char datain)
{
     unsigned char i=0;
     while(BF==1)
     {
         //delayus(5);
         for(i=0;i<5;i++)
         {
            NOP();
            NOP();
            NOP();
         }
         CLRWDT();
     }
repeat:
     WCOL=0;
     SSPBUF=datain;
     while(WCOL==1)
     {
         goto repeat;
     }
     CKP=1;
     return;     
}

//---------name:uart_initial---------//
//input: none
//output:none
//------function :initial uart------//
void uart_initial(void)
{

    TXSTA=0x00;
    RCSTA=0x00;
//tx,rx direction   
    TRISB5=1;
    TRISB7=1;//test
// baud rate,9600
    ABDEN=0;
    BRG16=0;
    BRGH=1;
    SPBRG=71;
// 8bit data 
    TX9=0;
    RX9=0;
// enable asy uart
    SYNC=0;
    SPEN=1;
// interrupt enable
    PIR1=0;
    TXIE=0;
    RCIE=1;  
// enable receive,don't transmit
    TXEN=0;
    CREN=1; 
    CLRWDT();
}
//------------name:uart_send----------//
//input: 1 byte want to send via uart
//output:none
//-------function :send via uart------//
void uart_send_byte(unsigned char datain)
{
  //  TXEN=1;
    TXREG=datain;
    while(TRMT!=1);
 //   TXEN=0;
}
//---------name:uart_send_data---------//
//input: data pointer want to send via uart
//output:none
//-------function :send via uart------//
void uart_send_data(unsigned char *p,unsigned char len)
{
    unsigned char i=0;
    if(len<=0)
        return;
    TXEN=1;                 //enable tx
    for(i=0;i<len;i++)
    {
        uart_send_byte(*(p+i));
        CLRWDT();
    }
    TXEN=0;                 //disable tx
    
}
//---------name:ad_initial---------//
//input: none
//output:none
//------function :initial ad-------//
void ad_initial(void)
{
// config as a/d input,6 channel
     TRISC2=1;
     ANS6=1;
// a/d clock,fosc/64
     ADCON1=0x60;
// right format,AN6,,ref:VDD,turn on a/d
     ADCON0=0x99;
     CLRWDT();

}
//---------name:ad_test---------//
//input: none
//output:none
//---function :convert via ad--//
void ad_test(void)
{
// interrupt enable
     ADIF=0;
     ADIE=1;
// sample time delay

⌨️ 快捷键说明

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