📄 i2c.c
字号:
// this file debug finish.
// date:2004.2.2
#include<iom128v.h>
#include"TWI.H"
#include <control.h>
#include <lcd.h>
#include <macros.h>
extern unsigned char rd_device_add;
extern unsigned char wr_device_add;
//---------------------------------------------------------
// NAME: delayus()
// ENTRY: time, delay time constant, if time = 1, delay = 1.08us.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void delayus(unsigned int time)
{
while (time)
time--;
}
//---------------------------------------------------------
// NAME: delayms()
// ENTRY: time, delay time constant, if time = 1, delay = 1.08ms.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void delayms(unsigned int time)
{
while(time)
{
delayus(482);
WDR();
time--;
}
}
//---------------------------------------------------------
// NAME: select_qam_add()
// ENTRY: addr, qam chennal address number.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void select_qam_add(unsigned char addr)
{
switch(addr)
{
//qam address: 01 or 05
case 1:
rd_device_add = 0x11;
wr_device_add = 0x10;
break;
//qam address: 02 or 06
case 2:
rd_device_add = 0x13;
wr_device_add = 0x12;
break;
//qam address: 03 or 07
case 3:
rd_device_add = 0x15;
wr_device_add = 0x14;
break;
//qam address: 04 or 08
case 4:
rd_device_add = 0x17;
wr_device_add = 0x16;
break;
default:
break;
}
}
//---------------------------------------------------------
// NAME: select_chanl()
// ENTRY: chanl, i2c bus chennal number.
// add, qam chennal address number.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void select_chanl(unsigned char chanl,unsigned char add)
{
DDRB |= 0x60;
PORTB &= ~0x60;
delayms(10);
switch(chanl)
{
//sen1
case 1:
PORTB |= 0x40;
rd_device_add = 0x5b;
wr_device_add = 0x5a;
break;
//sen2
case 2:
PORTB |= 0x60;
rd_device_add = 0x5b;
wr_device_add = 0x5a;
break;
//qam1
case 3:
PORTB &= ~0x60;
select_qam_add(add);
break;
//qam2
case 4:
PORTB |= 0x20;
select_qam_add(add);
break;
default:
break;
}
// set potrd = input, release i2c bus
DDRD &= ~0x03;
PORTD &= ~0x03;
delayms(100);
// set portd = output, install i2c bus
DDRD |= 0x03;
PORTD |= 0x03;
delayms(20);
}
//---------------------------------------------------------
// NAME: Start()
// ENTRY: void.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void Start(void)
{
TWCR = (1 << TWINT) | (1 << TWSTA) | (1 << TWEN);
}
//---------------------------------------------------------
// NAME: Stop()
// ENTRY: void.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void Stop(void)
{
TWCR = (1 << TWINT) | (1 << TWSTO) | (1 << TWEN);
}
//---------------------------------------------------------
// NAME: TestAck()
// ENTRY: void.
// RETURN: return i2c ack status.
// MODIFY: 2004.2.2
//--------------------------------------------------------
unsigned char TestAck(void)
{
return TWSR & 0xf8;
}
//---------------------------------------------------------
// NAME: SetAck()
// ENTRY: void.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void SetAck(void)
{
TWCR |= 1 << TWEA;
}
//---------------------------------------------------------
// NAME: SetNoAck()
// ENTRY: void.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void SetNoAck(void)
{
TWCR &= ~(1 << TWEA);
}
//---------------------------------------------------------
// NAME: Twi()
// ENTRY: void.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void Twi(void)
{
TWCR = (1 << TWINT) | (1 << TWEN);
}
//---------------------------------------------------------
// NAME: Write8Bit()
// ENTRY: x, write to i2c device data.
// RETURN: void.
// MODIFY: 2004.2.2
//--------------------------------------------------------
void Write8Bit(unsigned char x)
{
TWDR = x;
TWCR = (1 << TWINT) | (1 << TWEN);
}
//---------------------------------------------------------
// NAME: Wait()
// ENTRY: void
// RETURN: if success return TRUE, otherwise return FALSE.
// MODIFY: 2004.2.2
//--------------------------------------------------------
unsigned char Wait(void)
{
unsigned char cout;
cout = 0;
while(!(TWCR & (1 << TWINT)))
{
cout++;
delayms(5);
WDR();
if(cout > 3)
{
Stop();
return FALSE;
}
}
return TRUE;
}
//---------------------------------------------------------
// NAME: i2c_Write()
// ENTRY: Wdata, data of write i2c device
// RomAddress, start address of write i2c device
// chanl, channel No. of write i2c device
// add, i2c device data address.
// RETURN: if success return TRUE, otherwise return FALSE or OUTTIME_ERROR.
// MODIFY: 2004.2.2
//--------------------------------------------------------
unsigned char i2c_Write(unsigned char Wdata, unsigned char RomAddress, unsigned char chanl, unsigned char add)
{
select_chanl(chanl,add);
// i2c start
Start();
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != START)
{
Stop();
return FALSE;
}
// write i2c device slave address & write method
Write8Bit(wr_device_add);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_SLA_ACK)
{
Stop();
return FALSE;
}
// write i2c device data address
Write8Bit(RomAddress);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_DATA_ACK)
{
Stop();
return FALSE;
}
// write i2c device data
Write8Bit(Wdata);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_DATA_ACK)
{
Stop();
return FALSE;
}
// i2c stop
Stop();
delayms(10);
return TRUE;
}
//---------------------------------------------------------
// NAME: i2c_Read()
// ENTRY: Rdata, data of read i2c device.
// RomAddress, start address of read i2c device.
// chanl, channel No. of read i2c device.
// add, i2c device data address.
// RETURN: if success return TRUE, otherwise return FALSE or OUTTIME_ERROR.
// MODIFY: 2004.2.2
//--------------------------------------------------------
unsigned char i2c_Read(unsigned char *Rdata, unsigned char RomAddress, unsigned char chanl, unsigned char add)
{
select_chanl(chanl,add);
//i2c start
Start();
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != START)
{
Stop();
return FALSE;
}
// write i2c device slave address & write mothed
Write8Bit(wr_device_add);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_SLA_ACK)
{
Stop();
return FALSE;
}
// write i2c device data address
Write8Bit(RomAddress);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_DATA_ACK)
{
Stop();
return FALSE;
}
// i2c restart
Start();
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != RE_START)
{
Stop();
return FALSE;
}
// write i2c device slave address & read mothed
Write8Bit(rd_device_add);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MR_SLA_ACK)
{
Stop();
return FALSE;
}
// start i2c read mothed
Twi();
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MR_DATA_NOACK)
{
Stop();
return FALSE;
}
// read i2c data
*Rdata = TWDR;
// i2c stop
Stop();
return TRUE;
}
//---------------------------------------------------------
// NAME: i2c_Write_mbyte()
// ENTRY: *pdata, data pointer of write i2c device
// RomAddress, start address of write i2c device
// bynum, byte numbers of write i2c device
// chanl, channel No. of write i2c device
// add, i2c device data address.
// RETURN: if success return TRUE, otherwise return FALSE or OUTTIME_ERROR.
// MODIFY: 2004.2.2
//--------------------------------------------------------
unsigned char i2c_Write_mbyte(unsigned char *pdata, unsigned char RomAddress, unsigned char bynum, unsigned char chanl, unsigned char add)
{
unsigned char i;
select_chanl(chanl, add);
// i2c start
Start();
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != START)
{
Stop();
return FALSE;
}
//write devide address
Write8Bit(wr_device_add);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_SLA_ACK)
{
Stop();
return FALSE;
}
// data start address of write i2c device
Write8Bit(RomAddress);
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_DATA_ACK)
{
Stop();
return FALSE;
}
for(i = 0; i < bynum; i++)
{
//write data to i2c device
Write8Bit(*(pdata + i));
if(Wait())
return OUTTIME_ERROR;
if(TestAck() != MT_DATA_ACK)
{
Stop();
return FALSE;
}
}
// i2c stop
Stop();
delayms(10);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -