📄 i2c.bak
字号:
// i2c.c
/********************************************************************/
/* */
/* I2C Interrupt */
/* */
/********************************************************************/
#include <ADuC7020.h>
#include "common.h"
void InitI2c(void){
i2c_stop = FALSE; // Initialize I2C flags
i2c_first = TRUE;
i2c_receive = 0x00;
I2CSTX = A0h[0]; // for first I2C operation assuming we will get the address A0
}
/*
void i2c(void){
static BYTE i2c_addr=0, byte_addr=0, byte_data=0;
int status = I2CSSTA;
if((status & 0x08) == 0x08){ // slave-receiver INT?
GP4DAT ^= 0x00040000;
/////////STATE2/////////////
if(i2c_first == TRUE){ // first slave-receiver INT
if(I2C0SIDD==0) i2c_addr = 0xA0; // get i2c device address
else i2c_addr = 0xA2;
byte_addr = I2CSRX; // get byte address
I2C0SSTA |= 0x80; // flush TX FIFO
if(i2c_addr==0xA0)I2CSTX = A0h[byte_addr]; // set tx data for next read access
if(i2c_addr==0xA2)I2CSTX = A2h[byte_addr];
i2c_first = FALSE; // clear i2c_first flag
}
/////////STATE3/////////////
else{ // slave-receiver INT
byte_data = I2CSRX; // get byte data
i2c_write(i2c_addr, byte_addr, byte_data); // save received byte data
I2C0SSTA |= 0x80; // flush TX FIFO
byte_addr++; // inclement byte address
if(i2c_addr==0xA0)I2CSTX = A0h[byte_addr];// set tx data for next read access
if(i2c_addr==0xA2)I2CSTX = A2h[byte_addr];
}
}
/////////STATE4/////////////
if((status & 0x04) == 0x04){ // slave-transmitter INT?
GP4DAT ^= 0x00040000;
if(I2C0SIDD==0)i2c_addr = 0xA0; // get i2c device address
else i2c_addr = 0xA2;
if(i2c_addr==0xA0){
I2CSTX = A0h[byte_addr]; // set tx data (current address)
byte_addr++; // increment byte address
I2CSTX = A0h[byte_addr]; // set tx data (next address)
}
if(i2c_addr==0xA2){
I2CSTX = A2h[byte_addr]; // set tx data (current address)
byte_addr++; // increment byte address
I2CSTX = A2h[byte_addr]; // set tx data for next read access
}
}
return;
}
*/
/********************************************************************/
/* */
/* I2C-write / Slave-receiver */
/* */
/********************************************************************/
void i2c_write(BYTE i2c_addr, BYTE byte_addr, BYTE byte_data){
if(i2c_addr==0xA0) A0h[byte_addr] = byte_data;
if(i2c_addr==0xA2) A2h[byte_addr] = byte_data;
i2c_receive = i2c_addr; // set i2c device address for FlashUpdate function
// update DACs
if((i2c_addr==0xA2)&&((byte_addr==248)||(byte_addr==249))) SetDac(0);
if((i2c_addr==0xA2)&&((byte_addr==250)||(byte_addr==251))) SetDac(1);
// run Force-Flash-Update
//if(FORCE_FLASH_UPDATE) FlashUpdate();
// run checksum
if((i2c_addr==0xA0)&&(byte_addr<63)) Checksum(1);
if((i2c_addr==0xA0)&&(63<byte_addr)&&(byte_addr<95)) Checksum(2);
if((i2c_addr==0xA2)&&(byte_addr<95)) Checksum(3);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -