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

📄 master_i2c通讯协议.txt

📁 PIC18F6720同PIC18F6720之间进行I2C通讯,调试通过.
💻 TXT
字号:
通讯协议:
引脚定义:slave_I2C_data 接到PIN_B1; 
         slave_I2C_clk接到PIN_B2;
    1接收起始位: 当我收到PIN_B1从1变为0时,我会立即进入INT1中断服务程序;这时,PIN_B2必须为1,否则,会立即退出INT1中断服务程序.也就是说,IIC的起动条件必须满足:在PIN_B2=1时,PIN_B1脚出现一个下降沿;若条件满足,程序接收状态;
    2 等待PIN_B2再次变1,发0XAA给我,不带开始位;
    3 连发5位ASCII,带小数点,如:'0','6','.','0','0'
    4 发给你的程序我已做了测试,通讯没有问题.
    5 麻烦你多测试几编,我没有时间测试;
//发送送和接收I2C,必要时请你修改,直到通讯正常;




#if defined(__PCH__)
#include <18F6720.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP  //HS:使用外部晶振10MHz;
                                 //NOWDT:不使用看门狗
                                 //NOPROTECT程序不保护
#use delay(clock=10000000)       //使能内部函数delay_ms()和delay_us()

#define SCLK   PIN_B2
#define DATA   PIN_B1
//int buffer[5]={'0', '0', '.', '0', '0'};
//主机发送"启动条件"函数;
 void I2CStart(void)
 {
                     //屏蔽所有中断
 output_high(DATA);
 output_high(SCLK);  //将DATA脚和SCLK置为高电平,为发送启动条件做准备
 delay_us(20);
 output_low(DATA);   //在SCLK为高电平期间,DATA脚出现下降沿,表示"起动I2C"
 delay_us(50);
 output_low(SCLK);   //SCLK脚置低电平,为下次移位做准备;
 delay_us(20);
 }

//主机发送"停止条件"函数;
 void I2CStop(void)
 {
 output_low(SCLK);
 output_low(DATA);   //将DATA脚和SCLK置为低电平,为发送"停止条件"做准备
 delay_us(20);
 output_high(SCLK);
 delay_us(20);
 output_high(DATA);  //在SCLK为高电平期间,DATA脚出现上降沿,表示"停止I2C"
                     //开所有中断允许位
 delay_us(20);
 }


//从I2C输出一个字节
void write_I2C_byte(BYTE cmd) {
   BYTE i;
   for(i=0;i<=7;++i) {
      output_bit(DATA, shift_left(&cmd,1,0) ); //将cmd所指的单元左移一位,右端补0,移出的位经DATA脚输出
                                               //先送出cmd所指单元的最高位
      output_high(SCLK);                       //SCLK脚上升沿到来时,从机收到一位值;
      delay_us(5);
      output_low(SCLK);                        //SCLK脚置低电平,为下次移位做准备;
      delay_us(5);
   }
}

//从I2C读入一个字节
BYTE read_I2C_byte( ) {
   BYTE i, data1;
   for(i=0;i<=7;++i) {
      shift_left(&data1,1,input(DATA));  //CPU从PCF8563读入1位,先读入的是发送数据的最高位;
      output_high(SCLK);              //SCLK脚上升沿到来时,告诉从机已经移出一位值;
      delay_us(5);
      output_low(SCLK);               //SCLK脚置低电平,为PCF8563下次移位做准备
      delay_us(5);
   }
   return(data1);
}


 /**-----------------------------------------------------------------------------
 函数说明:I2C专用,等待从器件接收方的应答
 ---------------------------------------------------------------------------------*/
 int1 WaitAck(void)
 {
 int errtime=255;//因故障接收方无ACK,超时值为255.
 //output_float(DATA);  //将DATA引脚设为输入,开集电极连接
 output_high(DATA);
 delay_us(5);
 output_high(SCLK); //SCLK脚上升沿到来时,从机发送ACK信号;
 delay_us(5);
 //bit_set(*0xF94,4); //端口C的方向寄存器地址为0xF94
                    //将端口C的方向寄存器的第4位,置1,即将PIN_C4设置为输入方式

 while(input(DATA)){
             errtime--;
             if (!errtime)
              {I2CStop();
               //bit_clear(*0xF94,4); //端口C的方向寄存器地址为0xF94,DATA脚设置为输出
               //SystemError=0x11;
               return FALSE;
              }
            }
 output_low(SCLK);
 delay_us(5);
 return TRUE;
 }

 /**-------------------------------------------------------------------------------
 函数说明:I2C专用,主器件为接收方,从器件为发送方时,应答信号。
 ---------------------------------------------------------------------------------*/
 void SendAck(void)
 {
  output_low(DATA);    //将DATA脚设置为低电平,该位值是即发出的"应答信号";
  delay_us(5);
  output_high(SCLK); //SCLK脚上升沿到来时,从机收到一位值;
  delay_us(5);
  output_low(SCLK);  //SCLK脚置低电平,一个移位时钟结束;
  delay_us(5);
 }

 /**-------------------------------------------------------------------------------
 函数说明:I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
 }**-------------------------------------------------------------------------------*/
 void SendNotAck(void)
 {
  output_high(DATA);  //将DATA脚设置为高电平,该位值是即发出的"非应答信号";
  delay_us(5);
  output_high(SCLK);//SCLK脚上升沿到来时,从机收到一位值;
  delay_us(5);
  output_low(SCLK); //SCLK脚置低电平,一个移位时钟结束;
  delay_us(5);
 }

//主机发送函数
 void write_IIc(int *buff)
 //void write_IIc()
 {int i;
  I2CStart();            //发开始条件
  write_I2C_byte(0xaa); //发送"写器件地址","写器件地址"为0xAA
  WaitAck();            //等待主机P_B1脚被从机PIN_B1拉低,等待从机应答;
  for(i=0;i<5;i++)
    {//write_I2C_byte(buffer[i]); //发送器件的data值(ASCII格式)
     write_I2C_byte(buff[i]); //发送器件的data值(ASCII格式)
     if(i<4)  WaitAck();   //主机等待P_B1脚被从机PIN_B1拉低,发应答信号;
                             //因为从机发应答,所以主机要等从机应答
    }
  //output_high(SCLK);
  //output_high(DATA);
  I2CStop();//发不发送停止I2C条件,请你根据情况;
 }
void main()
{int buffer[5]={'0', '0', '.', '0', '0'};
 //int i=5;
 output_high(DATA);
 output_high(SCLK);
 delay_ms(2000);
 do{
    write_IIc(buffer);//发0mA
    delay_ms(2000);

    buffer[1]='1';
    write_IIc(buffer); //发1mA
    delay_ms(2000);

    buffer[1]='2';
    write_IIc(buffer);//发2mA
    delay_ms(1000);

    buffer[1]='3';
    write_IIc(buffer);//发3mA

    delay_ms(2000);

    buffer[1]='4';
    write_IIc(buffer);//发4mA
    delay_ms(2000);

    buffer[1]='5';
    write_IIc(buffer);//发5mA
    delay_ms(1000);

    buffer[1]='6';
    write_IIc(buffer);//发6mA
    delay_ms(2000);

    buffer[1]='7';
    write_IIc(buffer);//发7mA
    delay_ms(1000);

    buffer[1]='8';
    write_IIc(buffer);//发8mA
    delay_ms(2000);

    buffer[1]='9';
    write_IIc(buffer);//发9mA
    delay_ms(1000);

    buffer[0]='1';
    buffer[1]='0';
    write_IIc(buffer);//发10mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='1';
    write_IIc(buffer);//发11mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='2';
    write_IIc(buffer);//发12mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='3';
    write_IIc(buffer);//发13mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='4';
    write_IIc(buffer);//发14mA
    delay_ms(1000);

    buffer[0]='1';
    buffer[1]='5';
    write_IIc(buffer);//发15mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='6';
    write_IIc(buffer);//发16mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='7';
    write_IIc(buffer);//发17mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='8';
    write_IIc(buffer);//发18mA
    delay_ms(2000);

    buffer[0]='1';
    buffer[1]='9';
    write_IIc(buffer);//发19mA
    delay_ms(2000);

    buffer[0]='2';
    buffer[1]='0';
    write_IIc(buffer);//发20mA
    delay_ms(2000);

    buffer[0]='2';
    buffer[1]='1';
    write_IIc(buffer);//发21mA
    delay_ms(2000);

    buffer[0]='2';
    buffer[1]='2';
    write_IIc(buffer);//发22mA
    delay_ms(2000);

    buffer[0]='2';
    buffer[1]='3';
    write_IIc(buffer);//发23mA
    delay_ms(2000);

    buffer[0]='2';
    buffer[1]='4';
    write_IIc(buffer);//发24mA
    delay_ms(2000);

    buffer[0]='0';
    buffer[1]='0';
   }while(TRUE);
}

⌨️ 快捷键说明

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