📄 i2c_soft.c
字号:
#include "i2c_soft.h"
#include "global.h"
#include "lcd.h"
//unsigned temp_data[10]; // temp hide
void i2c_init_io()
{
SDA_OUT;
SCL_OUT;
}
void i2c_start()
{
SET_SDA; //SDA=1
SET_SCL; //SCL=1
DELAY(DELAY_TIME);
CLR_SDA; //SDA=0
DELAY(DELAY_TIME);
CLR_SCL;
DELAY(DELAY_TIME);
}
void i2c_stop()
{
CLR_SDA; //SDA=0
SET_SCL; //SCL=1
DELAY(DELAY_TIME);
SET_SDA; // SDA=1
DELAY(DELAY_TIME);
}
void i2c_send_byte(unsigned data)
{
unsigned BitCounter=8;
do{
if(data&0x80)
SET_SDA; // SDA=1;
else
CLR_SDA; // SDA=0;
SET_SCL; // SCL=1
DELAY(DELAY_TIME);
CLR_SCL; // SCL=0
DELAY(DELAY_TIME);
data<<=1; /*RLC*/
BitCounter--;
}while(BitCounter);
}
int i2c_check_ack() //
{
unsigned b;
SDA_IN; // set PB6 port is input mode
SET_SCL; //SCL=1
DELAY(DELAY_TIME);
b=READ_PORT;
DELAY(DELAY_TIME);
CLR_SCL; //SCL=0
DELAY(DELAY_TIME);
SDA_OUT; // set PA5 port is output mode
if (b&SDA) return 0;
return 1;
}
unsigned i2c_read_byte()
{
unsigned count=8,temp=0;
SDA_IN; // set PB6=SDA port is input mode(SDA output mode)
do {
SET_SCL;
temp<<=1;
DELAY(DELAY_TIME);
if (READ_PORT&SDA) temp=temp|0x01;
DELAY(DELAY_TIME);
CLR_SCL;
DELAY(DELAY_TIME);
count--;
}while (count);
SDA_OUT;
return temp;
}
void i2c_send_ack(){
CLR_SDA; //SDA=1
CLR_SCL; //SCL=1
DELAY(DELAY_TIME);
SET_SCL; //SCL=1 // SCL = 1
DELAY(DELAY_TIME);
CLR_SCL; //SCL=1 // SCL = 0
DELAY(DELAY_TIME);
}
void i2c_send_noack()
{
//send a no ack bit
SET_SDA;
CLR_SCL;
DELAY(DELAY_TIME);
SET_SCL;
DELAY(DELAY_TIME);
CLR_SCL;
DELAY(DELAY_TIME);
}
void i2c_send_data(unsigned chipaddr,unsigned dataaddr,unsigned datanum)
{
unsigned i=0;
i2c_start();
i2c_send_byte(chipaddr); // eprom address
if(i2c_check_ack()){
i2c_send_byte(dataaddr); // data address
if(i2c_check_ack()){
while (i<datanum){
// i2c_send_byte(temp_data[i++]); // temp hide
if (i2c_check_ack()==0) break;
}
}
}
i2c_stop();
DELAY(10);
}
void i2c_read_data(unsigned chipaddr,unsigned dataaddr,unsigned datanum)
{
unsigned i=0;
i2c_start();
i2c_send_byte(chipaddr); // eprom address
if(i2c_check_ack()){
i2c_send_byte(dataaddr); // data address
if(i2c_check_ack()){
i2c_start();
i2c_send_byte(chipaddr|0x01);
if(i2c_check_ack()){
while(i<datanum){
// temp_data[i++]=i2c_read_byte(); // temp hide
if (i==datanum) i2c_send_noack();
else i2c_send_ack();
}
}
}
}
i2c_stop();
}
// time control part
/*
extern unsigned long num[10];
extern unsigned min_value,hour_value;
void init_time()
{
temp_data[0]=temp_data[1]=0;
i2c_send_data(PCF8563_ADDR,CON_REG0_ADD,2); // control reg equal 0
}
void write_time(){
temp_data[0]=SEC_REG;
temp_data[1]=min_value;
temp_data[2]=hour_value;
i2c_send_data(PCF8563_ADDR,SEC_REG_ADD,3);
}
void read_time(){
int i;
i2c_read_data(PCF8563_ADDR,SEC_REG_ADD,0x03);
lcd_out_number(num[temp_data[0]&0x0f],8);
lcd_out_number(num[(temp_data[0]&0x70)>>4],7);
lcd_out_number(num[temp_data[1]&0x0f],6);
lcd_out_number(num[(temp_data[1]&0x70)>>4],5);
lcd_out_number(num[temp_data[2]&0x0f],4);
lcd_out_number(num[(temp_data[2]&0x30)>>4],3);
for(i=0;i<58;i++){
DELAY(1000);
}
}
*/
// set TDA7313 8/13
extern unsigned TDA7313_REG[];
void SET_TDA7313()
{
unsigned i=0,flag=0;
// unsigned error=0;
i2c_start();
i2c_send_byte(TDA7313_ADDR);
flag=i2c_check_ack();
while ((flag==1) && (i<8))
{ i2c_send_byte(TDA7313_REG[i]);
flag=i2c_check_ack();
i++;
}
i2c_stop();
// if (i<8 || flag==1) error=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -