📄 iic.c
字号:
/* ---------------------GESTIONE BUS I2C--------------------- */
/* Author : toniobr Date : 11/2003 */
/* ---------------------------------------------------------- */
#include <pic.h>
#include "delay.h"
#define PORTBIT(adr,bit) ((unsigned)(&adr)*8+(bit))
static bit SCL @ PORTBIT(PORTA,0); //porta per i dati rx e tx
static bit SDA @ PORTBIT(PORTA,1); //porta per il clock
static bit TRISA_SDA @ PORTBIT(TRISA,1);
#define TCLOCK 5 // 0-255 uSec (5 uS equivale a una frequenza di 100 Khz)
/*Comando start*/
iic_start()
{
TRISA_SDA=0;
SDA=1;
SCL=1;
DelayUs(TCLOCK);
SDA=0;
DelayUs(TCLOCK);
SCL=0;
DelayUs(TCLOCK);
}
/* Comando stop*/
iic_stop()
{
TRISA_SDA=0;
SCL=1;
DelayUs(TCLOCK);
SDA=1;
}
/* Legge lo stato del bit di acknoveldge*/
char iic_r_ack()
{
TRISA_SDA=1;
SCL=1;
DelayUs(TCLOCK);
if(!SDA){
SCL=0;
DelayUs(TCLOCK);
return 0;
}
else{
SCL=0;
DelayUs(TCLOCK);
return 1;
}
}
/* Invia il bit di ack */
iic_w_ack(char value)
{
TRISA_SDA=0;
SDA=value;
SCL=1;
DelayUs(TCLOCK);
SCL=0;
DelayUs(TCLOCK);
}
/* Scrive su un device*/
iic_write(char value)
{
char i;
TRISA_SDA=0;
for(i=1;i<=8;i++) //invia gli 8 bit
{
//SDA=(bit)(value & 0b10000000); //msb first da provare
if (value&0b10000000)
SDA=1;
else
SDA=0;
value=value<<1;
SCL=1;
DelayUs(TCLOCK);
SCL=0;
DelayUs(TCLOCK);
}
}
/* Legge da un device*/
char iic_read()
{
char i;
char value=0;
TRISA_SDA=1;
for(i=1;i<=8;i++) //riceve gli 8 bit
{
SCL=1;
value=value<<1;
value|=SDA; //msb first
DelayUs(TCLOCK);
SCL=0;
DelayUs(TCLOCK);
}
return value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -