打印

MSSP的I2C模式

[复制链接]
3146|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qhcmcu|  楼主 | 2008-10-22 12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
哪位大哥有I2C工作在从动模式的程序
沙发
machunshui| | 2008-10-22 17:03 | 只看该作者

本人写的一个例子

本人写的一个例子

https://bbs.21ic.com/club/bbs/list.asp?boardid=11&t=2950544&tp=%u672C%u4EBA%u5199%u7684%u4E00%u4E2Apic%20i2c%u6A21%u5757%u57FA%u4E8E%u4E2D%u65AD%u7684%u4ECE%u673A%u4F8B%u5B50

使用特权

评论回复
板凳
machunshui| | 2008-10-22 17:14 | 只看该作者

程序里面有个地方需要修正

程序里面有个地方需要修正
else if( (temp ^ 0b00001100) == 0 )

应该改为

else if( (temp ^ 0b00001101) == 0 )

前一个条件用于proteus模拟通过,

后一个用于实际电路.

原因是microchip手册上的描述有误.

使用特权

评论回复
地板
qhcmcu|  楼主 | 2008-10-23 14:33 | 只看该作者

楼上你好

用proteus模拟怎么SSP1IF置不了1,只运行按键和显示功能?
有PIC16F917/946接24C04的I2C模式程序吗?

使用特权

评论回复
5
dream2010| | 2008-10-23 15:12 | 只看该作者

I2C通讯程序借鉴

芯片MAX518实现I2C通讯程序如下,可以借鉴给你读下:

#include"pic.h"
#include"pic1687x.h"
unsigned char i;
unsigned char j;
unsigned char n;

const  char  table[127 ] = {0X80,0X86,0X8D, 0X93,0X99,0X9F,0XA5,0XAB,0XB1,0XB7,0XBC,0XC2,0XC7,0XCC,0XD1,0XD6,0XDA,0XDF,0XE3,0XE7,0XEA,0XEE,0XF1,0XF4,0XF6,0XF8,0XFA,0XFC,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFD,0XFB,0XF9,0XF7,0XF5,0XF2,0XEF,0XEC,0XE9,0XE5,0XE1,0XDD,0XD8,0XD4,0XCF,0XCA,0XC5,0XBF,0XBA,0XB4,0XAE,0XA8,0XA2,0X9C,0X96,0X90,0X89,0X83,0X80,0X79,0X72,0X6C,0X66,0X60,0X5A,0X55,0X4E,0X48,0X43,0X3D,0X38,0X33,0X2E,0X29,0X25,0X20,0X1C,0X18,0X15,0X11,0X0E,0X0B,0X09,0X07,0X05,0X03,0X02,0X00,0X00,0X00,0X00,0X00,0X00,0X01,0X02,0X04,0X06,0X08,0X0A,0X0D,0X10,0X13,0X16,0X1A,0X1E,0X22,0X27,0X2B,0X30,0X35,0X3A,0X40,0X45,0X4C,0X51,0X57,0X5D,0X63,0X69,0X6F,0X76,0X7C};

void I2Cinitial()
{
SSPCON=0X08;   //00001000主控I2C工作模式
SSPCON2=0X00;
SSPSTAT=0X80;
SSPADD=0X02;

TRISC3=1;
TRISC4=1;
TRISA4=0;
RA4=0;       //关闭74HC165芯片占线功能

GIE=0;
SSPEN=1;
SSPIF=0;
}

void ACK()
{
  do
   {
     ;
    }while(SSPIF==0)  //等待总线发送数据字节完成.
    SSPIF=0;
}

void I2Cout()
{
SEN=1;
for(i=3;i--;) continue;
  do
   {
     RSEN=1;
    }while(SSPIF==0)  //等待总线发送数据字节完成.
    SSPIF=0;
SSPBUF=0X58;
ACK();
SSPBUF=0X01;
ACK();
SSPBUF=j;
ACK();
PEN=1;
ACK();
}

void main()
{
I2Cinitial()
while(1)
  {
  for(i=0;i<=127;i++)
    j=table;
    I2Cout();
  }

}



使用特权

评论回复
6
machunshui| | 2008-10-23 16:53 | 只看该作者

proteus模拟时,先暂停,打开i2c debuger

proteus模拟时,先暂停,打开i2c debuger

用i2c debuger发送报文,

报文的内容回显示在数码管上.

917/946的i2c应该差不多,

microchip的外设长得都比较象

使用特权

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

本版积分规则

45

主题

86

帖子

1

粉丝