?? slaver_1._c
字號:
/* 段傳輝 2008 1.21
TWI 從機的查詢和中斷接收 依靠廣播0X00地址
ICCAVR6.31A chuanhuibh@sina.com
*/
#include"iom8v.h"
#include"UART.h
#include"delay.h"
#define uchar unsigned char
#define STATUS (TWSR&0xf8)
#define SLA_W 0x32
#define SLA_R 0x33
#define TWI_ADDRESS 0x32
#define START 0x08
#define RE_START 0x10
#define MT_SLA_WRITE_ACK 0x18
#define MT_SLA_READ_ACK 0x40
#define MT_DATA_ACK 0x28
#define MT_READ_ACK 0x58
#define TW_SR_DATA_ACK 0x80
void Start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
}
void Stop(void)
{
TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
}
void Load(uchar i)
{
TWDR=i;
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
}
void Get(unsigned char *d)
{
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
*d= TWDR;
}/**/
void ERROR(uchar state)
{Stop();
}
/*寫一個字節data,成功則返回1,否則
返回0*/
uchar WriteByte(uchar data)
{
//啟動I2C
Start();
if(STATUS!=START) {ERROR(STATUS);return 0;}
//發送從機地址(寫),等待回應, 錯誤檢測
Load(SLA_W);
if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
/*
//發送EEPROM地址,等待回應,錯誤檢測
Load(addr);
if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
*/
//發送數據,等待回應,錯誤檢測
Load(data);
if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
Stop();
return 1;//發送成功,返回1;
}
unsigned char ReadByte(unsigned char addr,
unsigned char *p_data)
{
//啟動I2C
Start();
if(STATUS!=START) {ERROR(STATUS);return 0;}
//發送從機地址(寫),等待回應, 錯誤檢測
Load(SLA_W);
if(STATUS!=MT_SLA_WRITE_ACK) {ERROR(STATUS);return 0;}
//發送EEPROM地址,等待回應,錯誤檢測
Load(addr);
if(STATUS!=MT_DATA_ACK) {ERROR(STATUS);return 0;}
//再次啟動I2C
Start();
if(STATUS!=RE_START) {ERROR(STATUS);return 0;}
//發送從機地址(讀),等待回應, 錯誤檢測
Load(SLA_R);
if(STATUS!=MT_SLA_READ_ACK) {ERROR(STATUS);return 0;}
//讀取I2C數據
Get(p_data);
if(STATUS!=MT_READ_ACK) {ERROR(STATUS);return 0;}
//發送Stop,結束讀I2C操作。
Stop();
return 1;
}/**/
void Init_Io(void)
{
DDRC&=~((1<<PC4)&(1<<PC5)&(1<<PC2));
PORTC|= (1<<PC4)|(1<<PC5)|(1<<PC2);
//TWI接口初始化,從器件模式
TWAR=TWI_ADDRESS | (1<<TWGCE);
TWCR=(1<<TWEA) | (1<<TWEN)|(1<<TWIE);
asm("SEI");
}
void main()
{
// uchar temp1,temp2;
Init_Io();
uart_init();
puts("串口正常工作");
while(1)
{ /*
TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN); //啟動一次接收
while((TWCR&(1<<TWINT))==0); //等待有數據被接收
//Delay_nms(100);
temp1=STATUS;
temp2=TWDR;
//putchar(temp1);
if(temp1==0x90)
{
puts("接受到:");
putchar(temp2);
}
*/
}
}
#pragma interrupt_handler TWI_ISR:18
void TWI_ISR(void)
{
uchar temp1,temp2;
temp1=STATUS;
temp2=TWDR;
if(temp1==0x90)
{
puts("接受到:");
putchar(temp2);
}
TWCR=(1<<TWINT)|(1<<TWEA) | (1<<TWEN)|(1<<TWIE); //啟動一次接收
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -