📄 iic_rw.c
字号:
//*********************************************************************
// IIC_RW.c 1828 的通讯程序文件
// by hibernate 2005.9.29
// ShenZhen Challenge Technology Co.,Ltd
//remarks:本文件根据vxis原参考程序中func_shi文件改写
// 修改:IIC改了死循环
//*********************************************************************
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#include "vxis1828.h"
#include "config.h"
//IIC_RW.c文件中的分开的读写函数定义
char read1828(char address);
void write1828(char address,char buf_data);
//函数定义
void delay_nop();
void stop_IIC();
void start_IIC();
void nack_IIC();
//void ack_IIC();
bit send_IIC(char bytedata);
char receive_IIC();
//读写口定义
sbit sda = SDA_PORT; //to 1828 serial data/address
sbit scl = SCL_PORT; //to 1828 serial clock
//****************************************
// 函数:char read1828(char address)
// 作用:从1828的寄存器中读取一个8位数据
// 参数:address => 8 bits , Reg address
// remarks: 程序的写法可以参考SPEC,
//***************************************
char read1828(char address)
{
char buffer;
unsigned char i = 0;
bit ack = 0; // 1 => Acknowledge,0 => No Acknowledge
char device = VX1828;
for(i = 0;i < 10 && !ack;i++) // 读成功可以返回,最多的重试次数为10次
{
stop_IIC();
delay_nop();
start_IIC(); // Master send command Stop =>Start
if ((ack = send_IIC(device++)) == 1) // Send the device number and Set the R/W bit
ack = send_IIC(address);
if(!ack)
continue; // 没有响应时进入下次重试
// Ready for receive data
buffer = 0x00;
stop_IIC();
delay_nop();
start_IIC(); // Master send command Stop =>Start
if((ack = send_IIC(device++)) == 1) // Send the device number and Set the R/W bit
{
buffer = receive_IIC(); // Save received data to buf_data
nack_IIC();
}
} //设备没有响应时重新尝试读数据
delay_nop();
stop_IIC();
delay_nop();
return buffer;
}
//****************************************
// 函数:void write1828(char address,unsigned char count,char *buf_data)
// 作用:向1828写count个数据
// 参数:address => 8 bits , Reg address
// remarks:程序的写法可以参考SPEC,
//***************************************
void write1828(char address,char buf_data)
{
//unsigned char i = 0;
//for(i = 0;i < ;i++) // 写成功可以返回,最多的重试次数为10次
//{
stop_IIC();
delay_nop();
start_IIC(); // Master send command Stop =>Start
send_IIC(VX1828); // Send the device number and Set the R/W bit
send_IIC(address); // Send the address of reg
send_IIC(buf_data); // Send the data pointed the buf_data index
//}
}
//********************************************
// 函数:void send_IIC(char data)
// 作用:IIC 向 1828 发送数据
// 参数:bytedata =>8位,要发送的数据
// remarks: 1、发送数据通过移位一位一位的发送,当位是1时sda写1,位是0时sda写0
// 2、发送成功返回1,否则返回0
//********************************************
bit send_IIC(char bytedata)
{
char i = 0;
bit ack; // 0 => Acknowledge,1 => No Acknowledge
scl = 0;
delay_nop();
for (i = 8;i > 0;i--)
{
//sda = 0; // sda low
if (bytedata & 0x80)
sda = 1; // sda high
else
sda = 0;
delay_nop();
bytedata <<= 1; // bytedata left shift
// Generate SCLK
scl = 1;
delay_nop(); // scl high
scl = 0;
delay_nop(); // scl low
}
delay_nop();
sda = 1;
delay_nop(); // sda high
scl = 1;
delay_nop(); // scl high
ack = sda;
delay_nop(); // Read ack 0:Acknowledge; 1:No Acknowledge
scl = 0;
delay_nop(); // scl low
return !ack;
}
//********************************************
//函数:char receive_IIC()
//作用:从IIC(1828||EEPROM)接收数据
//参数:
//remarks:
//********************************************
char receive_IIC()
{
unsigned char i = 0;
char receive = 0; // 8 bits buffer for receive
for (i = 0x08;i > 0;i--) // 8位
{
receive <<= 1;
scl = 1; // scl high
delay_nop();
if (sda)
receive |= 0x01;
scl = 0; // scl low
delay_nop();
}
return receive;
}
//********************************************
//函数:void ack_IIC()
//作用:IIC响应时的设置(Acknowledge Function)
//rekmarks:进行多个字节的读取时要使用本函数
//*********************************************
/*
void ack_IIC()
{
sda = 0;
delay_nop(); // sda low
scl = 1;
delay_nop(); // scl high
scl = 0;
delay_nop(); // scl low
sda = 1;
delay_nop(); // sda high
}
*/
//********************************************
//函数:void nack_IIC()
//作用:IIC没有响应时的设置( Not Acknowledge Function)
//*********************************************
void nack_IIC()
{
// Acknowledge active
sda = 0;
delay_nop(); // sda low
scl = 1;
delay_nop(); // scl high
//Stop active
sda = 1;
delay_nop(); // sda high
scl = 0;
delay_nop(); // scl low
}
//********************************************
//函数:void start_IIC()
//作用:命令IIC开始时的设置(Start Function)
//*********************************************
void start_IIC()
{
sda = 1; // sda high
delay_nop();
scl = 1; // scl high
delay_nop();
sda = 0; // sda low
delay_nop();
scl = 0; // scl low
delay_nop();
}
//********************************************
//函数:void start_IIC()
//作用:命令IIC开始时的设置(Start Function)
//*********************************************
void stop_IIC()
{
scl = 0;
delay_nop(); // scl low
sda = 0;
delay_nop(); // sda low
scl = 1;
delay_nop(); // scl high
sda = 1;
delay_nop(); // sda high
}
//********************************************
// 函数:void delay_nop()
// 作用:延时
// remarks:
// Machine cycle = 24x2 + 12x3 = 84
// Crystal Frequency = 20 MHz
// Delay Time: 4.2us
//********************************************
void delay_nop()
{
//_nop_ ();
//_nop_ ();
//_nop_ ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -