[PIC®/AVR®/dsPIC®产品] 求 PIC18F13K22驱动OLED 的 硬件I2C程序

[复制链接]
1563|5
 楼主| 青莲新楓 发表于 2017-4-13 09:46 | 显示全部楼层 |阅读模式
我硬件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

主题

3

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部