#include "RX8F103.h"
#define STCON MSCON
#define SRXBUF MSRXBUF
#define STXBUF MSTXBUF
#define SSTAT0 MSSTAT0
#define SSTAT1 MSSTAT1
#define SIEN0 MSIEN0
#define SIEN1 MSIEN1
#define SSADDR MSADDR
//I2C主机多字节,单字节读写
//I2C Master 和 I2C Slave通信协议
/*
S + DevAdd(Read) + BayteN + Stop
S + DevAdd(Write) + BayteN + Stop
*/
//I2C从机地址 7位地址
#define I2C_SLAVE_ADD 0x50
#define BUFF_MAX 128
unsigned char xdata DataBuf[BUFF_MAX];
unsigned char DataTxIndex = 0;
unsigned char DataRxIndex = 0;
unsigned char InterruptIndex = 0;
unsigned char WrtieTxBufFlag = 0;
void EUart0_SendOneChar(char c)
{
ES0=0; //发送数据时关串口中断
TI0=0; //清TI位
S0BUF = c; //将待发送字符放入串口数据缓冲寄存器,并开始传输。
while(!TI0); //等待传送结束。当字符发送结束后由硬件置位请求中断,
//此时while循环结束,而串口中断处理函数需等到ES重新置1后才可能响应。
TI0=0; //软件清TI位,亦可在中断处理函数中清0
ES0 = 1; //开串口中断
}
void EUart0_SendString(char *st)
{
while(*st)
{
EUart0_SendOneChar(*st++);
}
}
void Uart0_init(void)
{
UART0PORTEN = 1; //串口端口使能
S0CON = 0x50; //SCON: Mode 1, 8-bit UART, Enable Rcvr
S0RELH = 0x03; //S0RELH + S0RELL 构成波特率设置S0REL[9:0]
S0RELL = 0xF7; //Baud rate = SYSCK/(16×(1024-S0REL)) SYSCK跟CLKDIV寄存器有关 波特率为115200
ES0 = 1; //允许串口中断位
EUart0_SendString("RX8F103 UART0 Init OK!\r\n");
}
void I2c_Init(void)
{
I2CPORTEN = 1; //IIC PORT口使能
TOPCON = 0x00; //IIC Slave
SSADDR = I2C_SLAVE_ADD;//IIC 从机地址寄存器
SIEN0 = 0x01; //正常结束中断
SIEN1 = 0x21; //使能接收区满中断
STCON = 0x40; //使能I2C
}
void I2c_TxBuf_Reset(void)
{
TOPCON |= 0x02;
TOPCON &= 0xFD;
I2c_Init();
}
void main(void)
{
unsigned char i;
CLKCON |= 0x1F; //默认所有时钟打开
RSTPORTEN = 1; //使能复位功能
Uart0_init();
//初始化数组
for (i=0; i<BUFF_MAX; i++)
{
DataBuf[ i] = 0x10+i;
}
I2c_Init();
EI2CFIFO = 1; //开IIC FIFO 中断
EI2CRXTX = 1; //开IIC TXRX 中断
EA = 1; //使能总中断
while(1);
}
/*
GC
SUNF
SOVF
SNE
以上任意一个或多个事件发送,均为产生EI2CRXTX中断
*/
void I2C_Slave_TRX_ISR(void) interrupt EI2CRXTX_VECTOR //TRX中断
{
unsigned char ReadData;
//Transmitted Data Byte not ready
if (0x04 == (SSTAT0 & 0x04))
{
//清中断标志位
SSTAT0 &= 0xFB;
}
//Receive Overflow
if (0x02 == (SSTAT0 & 0x02))
{
ReadData = SRXBUF;
//清中断标志位
SSTAT0 &= 0xFD;
}
//Normal End
if (0x01 == (SSTAT0 & 0x01))
{
InterruptIndex = 0;
WrtieTxBufFlag = 0;
I2c_TxBuf_Reset();
//清中断标志位
SSTAT0 &= 0xFE;
}
}
/*
STBE
STBF
SRBE
SRBF
以上任意一个或多个事件发送,均为产生EI2CFIFO中断
*/
void I2C_Slave_FIFO_ISR(void) interrupt EI2CFIFO_VECTOR //FIFO中断
{
unsigned char ReadData;
//Transmission buffer is empty
if (0x20 == (SSTAT1 & 0x20))
{
if ((DataTxIndex < BUFF_MAX) && (1 == WrtieTxBufFlag))
{
STXBUF = DataBuf[DataTxIndex];
DataTxIndex++;
}
SSTAT1 &= 0xDF;
}
// Reception buffer is full
if (0x01 == (SSTAT1 & 0x01))
{
ReadData = SRXBUF;
if (0 == InterruptIndex)
{
//收到Sub地址
if (ReadData < BUFF_MAX)
{
DataTxIndex = ReadData;
DataRxIndex = ReadData;
WrtieTxBufFlag = 1;
}
}
else
{
WrtieTxBufFlag = 0;
if (DataRxIndex < BUFF_MAX)
{
DataBuf[DataRxIndex] = ReadData;
DataRxIndex++;
}
}
InterruptIndex++;
SSTAT1 &= 0xFE;
}
}
/*---------------------------------EUART0 ISR--------------------------------------------*/
void EUART0ISR(void) interrupt EUART0_VECTOR //using 2
{
if(S0CON & RI0) //接收中断
{
}
RI0 = 0; //清中断标志位
}
程序主要不懂在下面这一段
if (0 == InterruptIndex)
{
//收到Sub地址
if (ReadData < BUFF_MAX)
{
DataTxIndex = ReadData;
DataRxIndex = ReadData;
WrtieTxBufFlag = 1;
}
}
else
{
WrtieTxBufFlag = 0;
if (DataRxIndex < BUFF_MAX)
{
DataBuf[DataRxIndex] = ReadData;
DataRxIndex++;
}
}
InterruptIndex++;
SSTAT1 &= 0xFE;
}
}
为什么if (0 == InterruptIndex)要这样判断,这样的不就会丢失第一个数据么
if (ReadData < BUFF_MAX)
{
DataTxIndex = ReadData;
DataRxIndex = ReadData;
WrtieTxBufFlag = 1;这段程序到底是啥意思,看不懂
|