PIC16F887 I2C通讯请教

2019-03-25 18:50发布

刚学单片机不久,最近有一个项目是用触摸板进行控制。
1、触摸板与主板之间是通过I2C进行通讯(触摸板芯片为从机);
2、目前想法是用PIC16F887单片机模拟触摸板;
3、现在有写了一个单片机(主机)与触摸板通讯的程序(如下所示),发送数据完毕后SDA还有个高电平(NG无应答.jpg图片),不知道怎么消除,所以想请教下各位前辈们。
4、附件中OK.jpg图片为实际产品与触摸板通讯波形。
程序如下:
#include <pic.h>
//__CONFIG(0x20f2);
//__CONFIG(0x3fff);
#define _XTAL_FREQ 16000000
void DELAY(unsigned int);
void IIC_SEND(char);
void IIC_Init(void);
char READ_EEPROM(char);
//unsigned char read(char);
void main(void)
{
char i,j,R1;
char addr;
addr=0x0d;
IIC_Init();
DELAY(10);
while(1)
{
  READ_EEPROM(addr);
  DELAY(100);
}
}
void IIC_SEND(char R)
{
SSPBUF=R;
while(SSPIF==0);
while(ACKSTAT==1);
}
char READ_EEPROM(char addr)
{
char R;
SEN=1;
while(SEN==1);
IIC_SEND(addr);
/*RSEN=1;
while(RSEN==1);
IIC_SEND(0xc1);*/
SSPIF=0;
RCEN=1;
while(SSPIF==0);
R=SSPBUF;
PEN=1;
while(PEN==1);
return(R);
}
void IIC_Init(void)
{
TRISC=0xff;
SSPCON=0x28;  //初始化SSPCON寄存器 00101000  //SSPM=1000,I2C主模式
SSPCON2=0X00;  //初始化SSPCON2寄存器
//SSPADD = 0x09;            // 当主频为16Mhz时波特率为400kbps,I2C波特率=Fosc/(4*(SSPADD+1)),SSPADD=[(Fosc/(BandRate*4)]-1
SSPADD = 0x39;            // 当主频为16Mhz时波特率为100kbps,I2C波特率=Fosc/(4*(SSPADD+1)),SSPADD=[(Fosc/(BandRate*4)]-1
SSPSTAT=0X80;  //初始化SSPSTAT寄存器
SSPIF=0;
WCOL=0;       // 写冲突检测位清零,若发送数据不正确请检查此位   
SMP=1;     
CKP=1;
CKE=0;        // 使用I2C协议规范电平 关闭斜率控制
    SSPEN=1;      //使能I2C模块*/
}
void DELAY(unsigned int n)
{
unsigned int j;
char k;
for(j=0;j<n;j++)
for(k=246;k>0;k--)
NOP();
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
he282942873
2019-03-26 07:30
本帖最后由 he282942873 于 2017-3-20 18:54 编辑

现在有两个问题:1、单片机和触摸芯片时钟都是40KHz,有点不明白的是40Khz时钟下波特率计算出来是99,但不清楚SSPADD = 0x99还是要再转换为16进制SSPADD = 0x63;
2、第二个问题是地址数据发送完后会有一段高电平,请问这个要怎么消除(NG 无应答(局部).jpg图片可以看到),担心这个高电平影响了后面的通讯。
通讯协议是我用逻辑分析仪抓出来的,正常通讯成功后触摸芯片空闲时会返回0xFF,当有键按下时会发送0x01/0x02...

一周热门 更多>