您好,我正在尝试使用PIC18F26K83与器件通信。根据设备数据手册,SCL的最大频率为1 Mhz。当我将I2C时钟设置为HFINTOSC(1 Mhz)时,它可以与设备通信(只要我的系统时钟在250 Khz和1 Mhz之间)。我什么都没有改变,只是将系统时钟从500 Khz更改为1 Mhz,并且它停止工作。怎么可能?我将HFINTOSC的I2C时钟设置为1 Mhz,这取决于系统时钟吗?
我的另一个问题又与I2C时钟有关。就像我说的那样,当我使用HFINTOSC作为I2C时钟时,只要系统时钟为500 kHz,它就可以工作。但是,当我尝试将Fosc或MFINTOSC与(500 kHz或1 MHz系统时钟)一起使用时,它不起作用。有人可以在这里引导我吗?因为我被困住了,所以我不为什么会这样。预先感谢。
用于设置内部振荡器的代码:
// OSCCON1 REGISTER
NOSC2_BIT=1;
NOSC1_BIT=1;
NOSC0_BIT=0;//HF INTERNAL OSC
//OSCFRQ REGISTER HFINTOSC FREQ. SELECTION
FRQ3_BIT=0;
FRQ2_BIT=0;
FRQ1_BIT=0;
FRQ0_BIT=0; // 0010 : 4 MHz , 0000:1 MHZ
NDIV3_BIT=0;
NDIV2_BIT=0;
NDIV1_BIT=0;
NDIV0_BIT=1;//DIVIDE BY 2
I2C配置代码:
//MODULE ENABLE
I2C1CON0.B7=1;delay_ms(500);
I2C1CON0.B7=1; //MODULE ENABLE
I2C1CON0.B6=0;//RSEN=0,RESTART ENABLE
I2C1CON0.B2=1;
I2C1CON0.B1=0;
I2C1CON0.B0=0; //MASTER MODE 7 BIT*/
I2C1CON1=0X80;
// SDA SCL pin ayarları
TRISC.RC4=0; //I2C:SDA
TRISC.RC3=0 ;//I2C:SCL
LATC.RC4=0;
LATC.RC3=0;
ANSELC=0XE7;// Clear RC3,RC4 analog inputs
ODCC4_BIT=1;//open drain control register, sink current only
ODCC3_BIT=1;
WPUC4_BIT=0;
WPUC3_BIT=0;// WEAK PULL UP DISABLE
//RXYI2C SLEW RATE PULLUP VS
RC3I2C=0X01;
RC4I2C=0X01;
SLRCONC.B4=0; //NO SLEW RATE LIMITING
SLRCONC.B3=0;
//PPS AYARLARI
PPSLOCK=0X55; //UNLOCK SEQUENCE
PPSLOCK=0XAA;
PPSLOCKED_BIT=0;
RC3PPS=0b00100001; //SCL OUTPUT RC3
I2C1SCLPPS=0b00010011; //SCL INPUT RC3
RC4PPS=0b00100010; //SDA OUTPUT RC4
I2C1SDAPPS=0b00010100; //SDA INPUT RC4
PPSLOCK=0X55; //LOCK SEQUENCE
PPSLOCK=0XAA;
PPSLOCKED_BIT=1;
//
I2C1CON2=0X04;
以及用于I2C时钟选择的代码:
// I2C CLOCK
I2C1CLK.B3 =0;
I2C1CLK.B2 =0;
I2C1CLK.B1 =0;
I2C1CLK.B0 =1; //0010 HFINT OSC 0001 FOSC
//I2C FREQUENCY=1000/5=200KHz
//FME=0 MEANS DIVISION=5
这是当我使用500 Kbps系统时钟和HFINTOSC作为I2Cx CLK时的SCL引脚的图像。
编辑:我检查了使用MFINTOSC或Fosc作为I2CxCLK看到的内容,它为空。 0V。不幸的是,没有时钟。