p18_i2c.c

来自「PIC18系列单片机」· C语言 代码 · 共 115 行

C
115
字号



#include "..\include.h"
//#include <pic.h>
#define I2C_TIMEOUT				60//15//(OSC_CLOCK/4)

void I2C2_Init( void )
{

	TRISD5=1;
	TRISD6=1;
	             // Slew rate control enable for high speed mode(400kHz)
	SSP2CON1=0x28; //SSPEN=1 and SSPM3:SSPM0=1000
	SSP2ADD= 0x28;                        //4Mhz cystall, 
	Delay10Us(1);
}

void I2C2_Start( void )
{
	unsigned int i;
	
	SEN2 = 1;            // initiate bus start condition
	for ( i=I2C_TIMEOUT; i; i-- ) {	// this is about 1ms timeout
		if ( SSP2IF )
			break;
	}
	SSP2IF=0;  
}

void I2C2_Stop( void )
{
	unsigned int i;
	
	PEN2 = 1;
	for ( i=I2C_TIMEOUT; i; i-- ) {	// this is about 1ms timeout
		if ( SSP2IF )
			break;
	}
	SSP2IF = 0;
}

unsigned char I2C2_ReadAck( void )
{
	unsigned int i;
	
	for ( i=I2C_TIMEOUT; i; i-- ) {	// this is about 1ms timeout
		if ( !ACKSTAT2 ) {
			return 1;
		}
	}
	return 0;
}

void I2C2_SendByte( unsigned char u8_data )
{
	unsigned int i;
	
	SSP2BUF = u8_data;
//	I2C2_ReadAck();
	for ( i=I2C_TIMEOUT; i; i-- ) {	// this is about 1ms timeout
		if ( SSP2IF ) {
			break;
		}
	}
	SSP2IF = 0;
	I2C2_ReadAck();
	SSP2IF = 0;
}

unsigned char I2C2_GetByte( void )
{
	unsigned int i;
	
	RCEN2 = 1;
	for ( i=I2C_TIMEOUT; i; i-- ) {	// this is about 1ms timeout
		if ( BF2 ) {
			break;
		}
	}
	SSP2IF = 0;

	return SSP2BUF;
}

void I2C2_SendACK( void )
{
	unsigned int i;
	
	ACKEN2 = 1;
	for ( i=I2C_TIMEOUT; i; i-- ) {	// this is about 1ms timeout
		if ( ACKEN2 == 0 ) {
			break;
		}
	}
	SSP2IF = 0;
}


void I2C2_SendNotACK( void )
{
	ACKDT2 = 1;
	I2C2_SendACK();
}

void RestartI2C( void )
{
	RSEN2 = 1;           // initiate bus restart condition
	while(!SSP2IF);                // Completed the action when the SSPIF is Hi.
		SSP2IF=0;  
}



⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?