📄 i2c.c
字号:
/* I2C器件AT24C256和RX8025A驱动程序
制作人:张彩霞
日期: 2003-11-12
*/
/* TMS320LF2407A与I2C接口
PE.1-----SCL
PE.0-----READ
PE.7-----WRITE
PE.2-----256WP(低电平可写入)
PEDATDIR 初始化时PE1 2 7为输出方式 高电平0
PE.0为输入方式
*/
#define I2C_C
#include "all_inc.h"
//#include "typedefine.h"
/*#define setscl pedatdir |= 0x0002
#define clrscl pedatdir &= 0xfffd
#define setsda pedatdir |= 0x0080
#define clrsda pedatdir &= 0xff7f
#define READ_ACK (pedatdir & 0x0001)*/
//avr config rx8025 ioport
#define setscl PORTC |= b6_msk
#define clrscl PORTC &= ~b6_msk
#define setsda PORTC |= b7_msk
#define clrsda PORTC &= ~b7_msk
#define READ_ACK (PINC & b7_msk)
void start(void);
void stop(void);
unsigned int read_ack(void);
void send_ack(void);
void write_byte(unsigned char data);
unsigned char read_byte(void);
unsigned char rx8025_write(unsigned int slave_addr,unsigned int addr_tran,unsigned char *data,unsigned char length);
unsigned char rx8025_stand_read(unsigned int slave_addr,unsigned int addr_tran,unsigned char *data,unsigned char length);
/*I2C起始信号
无参数
无返回值
*/
void start(void)
{
setscl;
setsda;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
clrsda;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
clrscl;
}
/*I2C结束信号
无参数
无返回值
*/
void stop(void)
{
clrsda;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
setscl;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
setsda;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
/* clrscl; */
}
/*写完一个字节后读应答信号*/
unsigned int read_ack(void)
{
unsigned int ack;
DDRC &= ~b7_msk; // config bit6 input
setsda;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
setscl;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
ack = READ_ACK;
clrscl;
DDRC |= b7_msk;
return ack;
}
/*读完一个字节后发送应答信号*/
void send_ack(void)
{
clrsda; /*发送0作为应答信号*/
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
setscl;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
clrscl;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
setsda; /*发送应答信号之后将释放sda*/
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
}
/* 写一个字节
形参:data
无返回值
*/
void write_byte(unsigned char data)
{
unsigned int i;
for(i=0;i<8;i++)
{ __delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
if(data & 0x80)
setsda;
else
clrsda;
data <<= 1;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
setscl;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
clrscl;
__delay_cycles(100);
// asm(" rpt #9");
// asm(" nop");
}
}
/*读一个字节
无形参
返回值为读到的参数
*/
unsigned char read_byte(void)
{
unsigned int i;
unsigned char readbyte=0;
DDRC &= ~b7_msk;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
for(i=0;i<8;i++)
{
setscl;
__delay_cycles(50);
// asm(" rpt #9");
// asm(" nop");
readbyte <<= 1;
if(READ_ACK)
{
readbyte += 1;
}
clrscl;
__delay_cycles(80);
// asm(" rpt #9");
// asm(" nop");
}
DDRC |= b7_msk;
return readbyte;
}
/* RX8025A写操作
slave_addr------8025地址,第0位为R/W位
addr_tran-------地址和转换模式,高4位为地址,低4位为转换模式
*data-----------数据指针
length----------数据长度
返回值----------返回-1则操作不成功,其他成功操作
*/
unsigned char rx8025_write(unsigned int slave_addr,unsigned int addr_tran,
unsigned char *data,unsigned char length)
{
unsigned int i;
unsigned char result=1;
start();
write_byte(slave_addr);
if(read_ack())
{
stop();
result = 0;
return result;
}
write_byte(addr_tran);
if(read_ack())
{
stop();
result = 0;
return result;
}
for(i=0;i<length;i++)
{
write_byte(*(data+i));
if(read_ack())
{
stop();
result=0;
return result;
}
}
stop();
return result;
}
/* RX8025读操作,
读方式----------标准读模式
slave_addr------8025地址,第0位为R/W位
addr_tran-------地址和转换模式,高4位为地址(0-F),低4位为转换模式
*data-----------数据指针
length----------数据长度
返回值----------返回-1则操作不成功,其他成功操作
*/
unsigned char rx8025_stand_read(unsigned int slave_addr,unsigned int addr_tran,
unsigned char *data,unsigned char length)
{
unsigned int i;
unsigned int result;
start();
write_byte(slave_addr);
if(read_ack())
{
stop();
result=0;
return result;
}
write_byte(addr_tran);
if(read_ack())
{
stop();
result=0;
return result;
}
start();
write_byte(slave_addr | 0x0001); /*读方式*/
if(read_ack())
{
stop();
result=0;
return result;
}
for(i=0;i<length;i++)
{
*(data+i) = read_byte();
if(i<length-1)
send_ack();
}
stop();
// return length;
return result;
}
/*初始化时钟芯片的工作及起始时间*/
void rx8025_init(void)
{
unsigned char result;
unsigned char buf[2]={0x20};
INT8U timedata[] = {0x10,0x59,0x23,0,0x20,0x10,0x08};
result = rx8025_write(SLAVE_ADDR_8025,0xe0,buf,1);
if(result)
{
result = rx8025_write(SLAVE_ADDR_8025,0x0,timedata,7);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -