📄 i2ctestmaster.c
字号:
/*----filename:CT_Test_V1.0-------*/
/*----version:V1.0---------------*/
/*----jchaodong-----------------*/
/*----2008.04.15---------------*/
//程序中接收数据时还应加上定时器判断数据是否接收完成
#define SDA_Derection TRISA2
#define SCL_Derection TRISC2
#define SDA RA2
#define SCL RC2
#define Idle 0
#define buf1_len 30
#define buf2_len 15
#define buf3_len 2
#define Node_Addr 0x00
#include <htc.h>
#include <pic.h>
#include <pic16f685.h>
//---------CONFIGbits,important------------//
__CONFIG(HS&WDTEN&PWRTDIS&MCLREN&UNPROTECT);
//---------variable declare---------------//
unsigned char State=0;
unsigned char I2C_Buff[buf1_len]={0};
unsigned char Buffer2[buf2_len]={"CT_TEST_V1.0"};
unsigned char Ad_Buffer[buf3_len];
unsigned char buff[2]={0x43,0x54};
bank2 unsigned char I2C_ptr=0;
bank2 unsigned char URT_ptr=0;
bank2 unsigned int second10ms=0;
bank2 unsigned char second=0;
bank2 unsigned char Rx_Start=0;
bank2 unsigned char Rx_Over=0;
bank2 unsigned char Ad_Over=0;
bank2 unsigned char I2c_Rd_Over=0;
bank2 unsigned char I2c_Wr_Start=0;
bank2 unsigned char I2c_Wr_Over=0;
//---------for i2c
bank2 unsigned char I2C_Ack=0;
unsigned char test_i=0;
//-------function declare---------//
void delayus(unsigned char);
void delayms(unsigned char);
//-------------------------------
void Slave_I2C_Initial(void);
void uart_initial(void);
void ad_initial(void);
void timer0_initial(void);
void timer1_initial(void);
void device_initial(void);
//-------------------------------
void interrupt isf(void);
void i2c_service(void);
void Write_I2c(unsigned char);
void uart_send_byte(unsigned char);
void uart_send_data(unsigned char *,unsigned char);
void ad_test(void);
void pulse_test(void);
//-------------------------------
void ad_deal_service(void);
void uart_deal_service(void);
void i2c_rd_deal(void);
void i2c_wr_deal(void);
//--------
void I2C_Start(void);
void I2C_Stop(void);
unsigned char I2C_CheckAcK(void);
void I2C_SendB(unsigned char);
unsigned char I2C_RceB(void);
void I2C_Ackn(unsigned char);
unsigned char Send_Nbyte(unsigned char,unsigned char*);
unsigned char Read_Nbyte(unsigned char);
//-------------------------------
void main(void)
{
unsigned char i,jcd;
unsigned char temp;
device_initial();
delayms(100);
delayms(100);
delayms(100);
delayms(100);
//uart_send_data(Buffer2,12);
while(1)
{
I2C_Stop();
{
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
delayms(100);
}
URT_ptr=0;
// I2C_Stop();
/*
I2C_Start();
I2C_SendB(0x03);
if(!I2C_Ack)
RC0=0;
else
RC0=1;
delayus(12);
jcd=I2C_RceB();
I2C_Ackn(0);
for(i=0;i<9;i++)
{
delayus(20);//20
I2C_Buff[i]=I2C_RceB();
I2C_Ackn(0);
}
delayus(20);
I2C_Buff[9]=I2C_RceB();
I2C_Ackn(1);
I2C_Stop();
uart_send_data(I2C_Buff,10);
*/
jcd=Read_Nbyte(15);
if(jcd)
{
if((I2C_Buff[0]==0x68)&&(I2C_Buff[14]==0x16))
{
temp=0;
for(i=1;i<13;i++)
{
temp+=I2C_Buff[i];
}
if(temp==I2C_Buff[13])
{
uart_send_data(I2C_Buff,15);
}
}
/*
else
{
I2C_Stop();
jcd=Read_Nbyte(15);
uart_send_data(I2C_Buff,15);
}*/
//Send_Nbyte(15,I2C_Buff);
}
else
{
I2C_Stop();
}
NOP();
NOP();
NOP();
NOP();
// delayms(100);
//Send_Nbyte(URT_ptr,Buffer2);
Send_Nbyte(12,Buffer2);
CLRWDT();
}
}
//---------name:Slave_I2C_Initial---------//
//input: none
//output:none
//---------function :initial i2c----------//
void Slave_I2C_Initial(void)
{
PORTB=0x00;
PIR1=0x00;
// for slave i2c mode,both input
TRISB4=1;
TRISB6=1;
// slave i2c mode,7 bit address// enable i2c and clock
SSPCON=0x36;
// set address for the device
SSPADD=Node_Addr;
// enable i2c and clock
// SSPEN=1;
// CKP=1;
// enable interrupt
SSPIE=1;
}
//---------name:interrupt isf---------//
//input: none
//output:none
//----function :interrupt service----//
void interrupt isf(void)
{
CLRWDT();
if(TMR1IE&&TMR1IF)
{
TMR1IF=0;
TMR1L=0xD8;
TMR1H=0xF1;
second10ms++;
if(second10ms%100==0)
{
//second10ms=0;
second++;
if(second%2==1)
{
//RC0=1;
}
else
RC0=0;
}
if(Rx_Start==1)
{
if(second10ms>3)
{
Rx_Over=1;
}
}
if(I2c_Wr_Start==1)
{
if(second10ms>3)
{
I2c_Wr_Over=1;
}
}
}
// I2C service
if(SSPIE&&SSPIF)
{
SSPIF=0;
//i2c_service();
}
// uart service
if(RCIE&&RCIF)
{
second10ms=0;
if(Rx_Start==0)
{
Rx_Start=1;
URT_ptr=0;
}
Buffer2[URT_ptr%buf2_len]=RCREG;
URT_ptr++;
if(URT_ptr>buf2_len)
{
URT_ptr=0;
}
// if error occur
if(FERR==1 || OERR==1)
{
CREN=0;
CREN=1;
}
}
// A/D service
if(ADIE&&ADIF)
{
ADIF=0;
Ad_Buffer[0]=ADRESH;
Ad_Buffer[1]=ADRESL;
Ad_Over=1;
}
}
//---------name:i2c_service-----------//
//input: none
//output:none
//----function:i2c interrupt service--//
void i2c_service(void)
{
//CLRWDT();
if(START==1 && RW==0 && DA==0 && BF==1)
{
State=1;
}
if(START==1 && RW==0 && DA==1 && BF==1)
{
State=2;
}
if(START==1 && RW==1 && DA==0 && BF==0)
{
State=3;
}
if(START==1 && RW==1 && DA==1 && BF==0)
{
State=4;
}
if(START==1 && RW==0 && DA==1 && BF==0)
{
State=5;
}
if(SSPOV==1)
{
SSPOV=0;
}
switch(State)
{
case 1: //master write data,this byte is address
{
I2C_Buff[0]=SSPBUF;
I2C_ptr=0;
break;
}
case 2://master write data,this byte is data
{
I2C_Buff[I2C_ptr%buf1_len]=SSPBUF;
I2C_ptr++;
if(I2C_ptr>buf1_len)
{
I2C_ptr=0;
}
if(I2c_Wr_Start==0)
{
I2c_Wr_Start=1;
}
second10ms=0;
break;
}
case 3://master read data,this byte is data
{
I2C_ptr=0;
Write_I2c(I2C_Buff[I2C_ptr%buf1_len]);
I2C_ptr++;
break;
}
case 4://master read data,this byte is data
{
//CKP=0;
Write_I2c(I2C_Buff[I2C_ptr]);
I2C_ptr++;
if(I2C_ptr>buf1_len)
{
I2C_ptr=0;
}
break;
}
case 5:
{
I2c_Rd_Over=1;
break;
}
default:
{
NOP();//something wrong happens
while(1);// wait for watch dog reset
}
}
State=0;
CLRWDT();
}
//---------name:Write_I2c---------//
//input: data want to send via I2C
//output:none
//--function :send data via i2c--//
void Write_I2c(unsigned char datain)
{
unsigned char i=0;
while(BF==1)
{
//delayus(5);
for(i=0;i<5;i++)
{
NOP();
NOP();
NOP();
}
CLRWDT();
}
repeat:
WCOL=0;
SSPBUF=datain;
while(WCOL==1)
{
goto repeat;
}
CKP=1;
return;
}
//---------name:uart_initial---------//
//input: none
//output:none
//------function :initial uart------//
void uart_initial(void)
{
TXSTA=0x00;
RCSTA=0x00;
//tx,rx direction
TRISB5=1;
TRISB7=1;//test
// baud rate,9600
ABDEN=0;
BRG16=0;
BRGH=1;
SPBRG=71;
// 8bit data
TX9=0;
RX9=0;
// enable asy uart
SYNC=0;
SPEN=1;
// interrupt enable
PIR1=0;
TXIE=0;
RCIE=1;
// enable receive,don't transmit
TXEN=0;
CREN=1;
CLRWDT();
}
//------------name:uart_send----------//
//input: 1 byte want to send via uart
//output:none
//-------function :send via uart------//
void uart_send_byte(unsigned char datain)
{
// TXEN=1;
TXREG=datain;
while(TRMT!=1);
// TXEN=0;
}
//---------name:uart_send_data---------//
//input: data pointer want to send via uart
//output:none
//-------function :send via uart------//
void uart_send_data(unsigned char *p,unsigned char len)
{
unsigned char i=0;
if(len<=0)
return;
TXEN=1; //enable tx
for(i=0;i<len;i++)
{
uart_send_byte(*(p+i));
CLRWDT();
}
TXEN=0; //disable tx
}
//---------name:ad_initial---------//
//input: none
//output:none
//------function :initial ad-------//
void ad_initial(void)
{
// config as a/d input,6 channel
TRISC2=1;
ANS6=1;
// a/d clock,fosc/64
ADCON1=0x60;
// right format,AN6,,ref:VDD,turn on a/d
ADCON0=0x99;
CLRWDT();
}
//---------name:ad_test---------//
//input: none
//output:none
//---function :convert via ad--//
void ad_test(void)
{
// interrupt enable
ADIF=0;
ADIE=1;
// sample time delay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -