青莲新楓 发表于 2017-4-13 09:46

求 PIC18F13K22驱动OLED 的 硬件I2C程序

我硬件I2C协议写了oled显示 初始化也写了 在51单片机上用模拟I2C运行完美在PIC上用模拟和硬件的I2C都不能通信

青莲新楓 发表于 2017-4-13 09:52

void init_fosc(void)
{
OSCCON = 0xF7;//16MHZ
}
void init_gpio(void)
{
   ANSEL=0x00;//使能数字输入
   ANSELH = 0x00;
   PORTB=0;
   LATB =0;
   TRISB =0xFF;

PORTC=0;
LATC=0;
TRISC =0x00;
}
void init_i2c_master()
{
    TRISB4 = input;
    TRISB6 = input;
    SSPCON1bits.SSPM0 = 0;
    SSPCON1bits.SSPM1 = 0;
    SSPCON1bits.SSPM2 = 0;
    SSPCON1bits.SSPM3 = 1;// I2C Master mode ,clock=Fosc/(4*(SSPxADD+1))
    SSPSTATbits.SMP = 0;//使能压摆率 400khz速度下
    SSPADD = 0x09;//SCL CLOCK Frequency 400KHZ
    SSPCON1bits.SSPEN = 1;
}
void i2c_master_tx(unsigned char tx_deviceaddr,unsigned char tx_resaddr,unsigned char tx_data)
{   
   PIR1bits.SSPIF = 0;//需要软件置0
    SSPCON2bits.SEN = 1;//启动条件
    while(SSPCON2bits.SEN == 1);//等启动条件完成SEN由硬件清零
    // PIR1bits.SSPIF = 1;   由硬件置1
   
   
    SSPBUF = tx_deviceaddr;//从机设备地址
    while(ACKSTAT);// ~ACK
    while(PIR1bits.SSPIF == 0);
    PIR1bits.SSPIF = 0;//需要软件置0
   
   
    SSPBUF = tx_resaddr;//写命令的寄存器
    while(ACKSTAT);// ~ACK
    while(PIR1bits.SSPIF == 0);
    PIR1bits.SSPIF = 0;
   
   
    SSPBUF = tx_data;//写数据
    while(ACKSTAT);// ~ACK
    while(PIR1bits.SSPIF == 0);
    PIR1bits.SSPIF = 0;
   
   
    SSPCON2bits.PEN = 1;//Stop condition
}

yangzj1974 发表于 2018-2-13 15:34

学习

598330983 发表于 2023-10-21 18:50

PIC的I2C硬件超难用

wahahaheihei 发表于 2023-10-24 20:41

设置成开漏模式。
页: [1]
查看完整版本: 求 PIC18F13K22驱动OLED 的 硬件I2C程序