?? twi.c
字號(hào):
/* @section I N C L U D E S */
#include "reg_C51.h"
char TWI_data;
char rw=0; /* 0=write, 1=read */
char slave_adr;
bit b_TWI_busy=0;
/**
* FUNCTION_PURPOSE:this function setup TWI in master mode and sends data to slave.
* FUNCTION_INPUTS:void
* FUNCTION_OUTPUTS:void
*/
void main(void)
{
SSCON |= 0x40; /* enable TWI */
EA=1; /* interrupt enable */
IEN1 |=0x02; /* enable TWI interrupt */
while(1) /* end less */
{
if(!b_TWI_busy && ((SSCON&0x10)!=0x10)) /* if the TWI is free */
{
b_TWI_busy=1; /* flag busy =1 */
TWI_data=0x55; /* data example to send */
slave_adr=0x01; /* slave adresse example */
rw=0; /* 0=write */
SSDAT = 0x00; /* clear buffer before sending data */
SSCON |= 0x20; /* TWI start sending */
}
}
}
/**
* FUNCTION_PURPOSE:TWI interrupt, task witch process the different status of TWI
* FUNCTION_INPUTS:void
* FUNCTION_OUTPUTS:void
*/
void it_TWI(void) interrupt 8 using 1
{
switch(SSCS) /* TWI status tasking */
{
case(0x00): /* A start condition has been sent */
{ /* SLR+R/W are transmitted, ACK bit received */
b_TWI_busy=0; /* TWI is free */
break;
}
case(0x08): /* A start condition has been sent */
{ /* SLR+R/W are transmitted, ACK bit received */
SSCON &= ~0x20; /* clear start condition */
SSDAT = (slave_adr<<1)|rw; /* send slave adress and read/write bit */
SSCON |= 0x04; /* set AA */
break;
}
case(0x10): /* A repeated start condition has been sent */
{ /* SLR+R/W are transmitted, ACK bit received */
SSCON &= ~0x20; /* clear start condition */
SSDAT = (slave_adr<<1)|rw; /* send slave adress and read/write bit */
SSCON |= 0x04; /* set AA */
break;
}
case(0x18): /* SLR+W was transmitted, ACK bit received */
{
SSDAT = TWI_data; /* Transmit data byte, ACK bit received */
SSCON |= 0x04; /* set AA */
break;
}
case(0x20): /* SLR+W was transmitted, NOT ACK bit received */
{
SSCON |= 0x10; /* Transmit STOP */
b_TWI_busy=0; /* TWI is free */
break;
}
case(0x28): /* DATA was transmitted, ACK bit received */
{
SSCON |= 0x10; /* send STOP */
b_TWI_busy=0; /* TWI is free */
break;
}
case(0x30): /* DATA was transmitted, NOT ACK bit received */
{
SSCON |= 0x10; /* Transmit STOP */
b_TWI_busy=0; /* TWI is free */
break;
}
case(0x38): /* Arbitration lost in SLA+W or DATA. */
{
SSCON |= 0x10; /* Transmit STOP */
b_TWI_busy=0; /* TWI is free */
break;
}
}
SSCON &= ~0x08; /* clear flag */
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -