打印

SRF08超声波传感器和dsPIC33E I2C通信问题

[复制链接]
1784|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Maximilianliebe|  楼主 | 2014-10-1 22:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我的代码,实在不知道哪里出了错误,求求大哥们帮忙!!
#include "p33EP512MU810.h"
#include "i2c.h"
#include <Initialisierung.h>
#include "Timer.h"


//Schritt 1


/*Configuring the general features of the microcontroller*/

_FGS(GSS_OFF & GWRP_OFF);
// External Oscillator
_FOSCSEL(FNOSC_PRIPLL);

_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF  & POSCMD_XT);
// Clock Switching is enabled and Fail Safe Clock Monitor is disabled
// OSC2 Pin Function: OSC2 is Clock Output
// Primary Oscillator Mode: XT Crystal

_FWDT(FWDTEN_OFF);
// Watchdog Timer Enabled/disabled by user software

_FICD(ICS_PGD3 &  JTAGEN_OFF & RSTPRI_PF);

_FPOR( BOREN_ON & ALTI2C1_OFF & ALTI2C2_OFF );
// Brown-out Reset (BOR) Detection Enable bit (BOR is enabled)
// Alternate I2C pins for I2C1 (SDA1/SCK1 pins are selected as the I/O pins for I2C1)
// Alternate I2C pins for I2C2 (SDA2/SCK2 pins are selected as the I/O pins for I2C2)


//Schritt 2

#define CFG_I2C2BRG  0x188
// (40MHz/100KHz)-2 = 0x188//I2C2=[(1/Fscl-PGD)*Fcy]-2

#define SONAR1 0xE0

unsigned int get_srf08(unsigned int SONAR);


/*** Global functions for the I2C2******************************************/
main(void)
{
     unsigned int range1=0;
     f_Initialisierung();

    unsigned int Config1; // ConfigI2c2 represents I2C2CON register.
         Config1 = (   I2C2_ON & I2C2_IDLE_CON & I2C2_CLK_HLD &
                       I2C2_IPMI_DIS & I2C2_7BIT_ADD & I2C2_SLW_DIS &
                       I2C2_SM_DIS & I2C2_GCALL_DIS & I2C2_STR_DIS &
                       I2C2_NACK & I2C2_ACK_DIS & I2C2_RCV_DIS &
                       I2C2_STOP_DIS & I2C2_RESTART_DIS & I2C2_START_DIS
                        );

    OpenI2C2(Config1,CFG_I2C2BRG);/*The following function initializes the I2C2 bus and
                                         set the I2C2 Bus Speed to 100KHz I2C2 used to communicate with the Ultrasonic sensors*/
    IdleI2C2();

/*End Configuration I2C2*/
    while(1)
    {
        range1=get_srf08(SONAR1);
    }
}
//Schritt 3
// Start Condition

  unsigned int get_srf08 (unsigned int SONAR)
{

    unsigned int range;  //range=Reichweiten
    unsigned char hi,lo; //high Byte,low Byte
   

     //StartI2C2();
        I2C2CONbits.SEN=1;         //send start bit
        while(I2C2CONbits.SEN);    //and wait fot it to clear      
     //MasterWriteI2C2(SRF08_ADDR);
        MasterWriteI2C2(0xE0);     //SRF08 I2C address
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);
     //MasterWriteI2C2(0x01);
        MasterWriteI2C2(0x01);    //Verstärkungsregister Adresse
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);       //then clear it
     //MasterWriteI2C2(0x00);
        MasterWriteI2C2(0x00);     //Verstärkung
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);          //then clear it
     //StopI2C2();
         I2C2CONbits.PEN=1;         //send stop bit
         while(I2C2CONbits.PEN);




     //StartI2C2();
         I2C2CONbits.SEN=1;         //send start bit
         while(I2C2CONbits.SEN);    //and wait fot it to clear
     //MasterWriteI2C2(SRF08_ADDR);
        MasterWriteI2C2(0xE0);     //SRF08 I2C address
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);
     //MasterWriteI2C2(0x02);
        MasterWriteI2C2(0x02);    //Reichweiten-Register Adresse
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);       //then clear it
     //MasterWriteI2C2(0xA0);
        MasterWriteI2C2(0xA0);     //Reichweiten=160    160*43mm+43mm = 6,9m
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);          //then clear it
     //StopI2C2();
         I2C2CONbits.PEN=1;         //send stop bit
         while(I2C2CONbits.PEN);




//Schritt 4

    /*now wait for the ranging to complete. This delay is 104ms*/
     //Timer off; 16-bit mode; Prescaler 2; Input clk CPU/64

     //delay_ms(80);
        T6CON = 0x0000;
        T6CONbits.TCKPS = 2;
        // Timer6 period 419.424 ms = 2.384222171 Hz
        PR6 = 0xFFFF-0x001;         //w:?
        // 40MHz/64 = 625KHz , 625KHz/65535 = 9.537 Hz
        //                                           = 104,855 ms
        // later on 80ms required form this timer for the utrasonic
        // initializing. the calculation as it shown below:
        //
        //  PeriodofChecking80ms      65535
        // --------------------- = --------- ===> PeriodtoCheck
        //          80ms           104,855ms

        IFS2bits.T6IF = 0;                //clear old interrupt request.
        IEC2bits.T6IE = 0;                //disable interrupt.
        T6CONbits.TON = 0;                //switch timer off.


//Schritt 5

        //finally get the range form the SRF08

     //StartI2C2();
        I2C2CONbits.SEN=1;         //send start bit
        while(I2C2CONbits.SEN);    //and wait fot it to clear            
    //??????? //MasterWriteI2C2(SRF08_ADDR+1);
        MasterWriteI2C2(0xE0|0x01);     //SRF08 I2C address+Read
        while(I2C2STATbits.TBF);
        while(!IFS3bits.MI2C2IF);       // Wait for 9th clock cycle.
        while(I2C2STATbits.ACKSTAT);    //then clear it      
     //??????????????????????
        hi = MasterReadI2C2();      //read Most Significant Bit
        AckI2C2();     //start acknowledge sequence
        while(I2C2CONbits.ACKEN);//wait for ack.sequence to end;
        
        lo = MasterReadI2C2();      //read Least significant Bit      
        NotAckI2C2();     //start acknowledge sequence
        while(I2C2CONbits.ACKEN);//wait for ack.sequence to end

     //StopI2C2();
        I2C2CONbits.PEN=1;         //send stop bit
        while(I2C2CONbits.PEN);

        range = ((hi<<8)+lo);
        
  }

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝