winnie 发表于 2009-3-11 14:46:29

求教16F88 I2C 通讯做主机的程序

请问PIC16F88在进行I2C 通信时,它做主机时它的起始条件和停止条件是怎么产生的?是硬件自动完成还是模拟?

winnie 发表于 2009-3-11 14:48:10

给个例子,参考下,另88不带主控IIC

/* ****************************************************************
** 功能描述: 单片机通过I2C控制MAX518输出DA
*************************************************************** */
#include "pic18.h"    /* PIC18系列的头文件 */
unsigned int DA_Delay_count=0; /* 间隔一定时间发送DA(I2C) ,不使DA过于频繁 */
unsigned int DA_data=0;      /* DA输出数据(数字量,0XFF对应5V)*/

/* ****************************************************************
** 函 数 名: initial()
** 功能描述: 系统初始化子程序,放在程序首部
*************************************************************** */
void initial()
{
INTCON=0x00;   /* bit7-bit0:关总中断 */
ADCON1=0X07;   /* 设置数字输入输出口 */
PIE1=0;   /* PIE1 的中断不使能 */   
PIE2=0;   /* PIE2 的中断不使能 */
PIE3=0;   /* PIE3 的中断不使能 */
}

/***************************************************************
** 函 数 名: I2C_Initial()
** 功    能:i2c初始化子程序,I2C用于向MAX518输出DA
****************************************************************** */
void   I2C_Initial()                  
{
SSPCON1=0X08;//允许串行口工作,I2C主控工作方式
TRISC=TRISC|0X08;
TRISC=TRISC|0X10;   //定义SCL,SDA
SSPADD=7;   //定义波特率,用4MHz时,时钟=4M/(4×(7+1))=0.125M
SSPSTAT=0X80;//I2C模式下,关闭标准速度方式(100K和1MK)的回转率控制
SSPCON2=0;   //初始化SSPCON2(该寄存器仅用于I2c方式)
TRISA=TRISA&0xef; //74HC165移位信号为输出,即不使用74HC165
RA4=0;    //74HC165移位信号为输出0,即不使用74HC165
SSPEN=1;      //使能串行口(SSP模块)
}

/***************************************************************
** 函 数 名: Wait_Ack()
** 功    能:主机等待从动芯片(MAX518)i2c应答子程序
****************************************************************** */
voidWait_Ack()
{   
do
{
;
}while(BF==1);    // 等待应答信号
SSPIF=0;   // 清标志
}

/***************************************************************
** 函 数 名: I2C_OUT()
** 功    能:主机向从动芯片(MAX518)输出DA数据
**参    数:DA_Out_data:DA转换数据,address:DA输出通道0或1(518只有2个通道)
****************************************************************** */
voidI2C_OUT(char DA_Out_data,char address)
{
unsigned char i=0;

I2C_Initial();    //I2C DA输出初始化
   SEN=1;      //启动I2C
for(i=1;i<18;i++)i=i;//延时
do       //启动I2C
{
      RSEN=1;   //重启动I2C
for(i=0;i<28;i++)i=i; //延时
if(SSPIF==1)break;//启动成功,继续执行I2C发送数据程序
else return;   //启动不成功,本次退出执行I2C程序,防止程序死机
}while(SSPIF==0);
SSPIF=0;   //清标志
    SSPBUF=0x58;                //向DA芯片MAX518写地址0X58
    Wait_Ack();   //等待应答
    SSPBUF=address;             //向MAX518写通道命令字节DA0通道或DA1通道
   Wait_Ack();   //等待应答
    SSPBUF=DA_Out_data;         //向DA芯片MAX518写DA转换的输出数据
Wait_Ack();   //等待应答
PEN=1;      //停止I2C
    Wait_Ack();   //等待应答
}

main()   
{
initial();   /* 系统初始化子程序 */
I2C_Initial();    /* i2c初始化子程序 */
while(1)
{
if(DA_Delay_count>=0x2f) // 间隔一定时间启动DA转换,不使DA转换过于频繁
{
   DA_Delay_count=0;// DA转换间隔时间延时清0
   DA_data=0x3f;   // D/A0通道转换数据为0X3F(1.25V)
   I2C_OUT(DA_data,0);// D/A0通道发DA转换数据
   DA_data=0xbf;   // D/A1通道转换数据为0XBF(3.75V)
   I2C_OUT(DA_data,1);// D/A1通道发DA转换数据
}
else DA_Delay_count++; // 不到DA转换间隔时间,继续延时
}
}
页: [1]
查看完整版本: 求教16F88 I2C 通讯做主机的程序