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 + -
显示快捷键?