BASIC4MCU | 통신 | I2C-IIC,TWI | TWI - 단방향 통신 (구구단) - 수신 인터럽트
페이지 정보
작성자 키트 작성일2017-09-01 10:54 조회2,669회 댓글0건본문
마스터 송신부는 앞장의 예제를 사용합니다.
//----------------------------------------------------------------------
// TWI 슬레이브 수신
//----------------------------------------------------------------------
#include <mega128.h>
#include <delay.h>
#include <stdio.h>
//
#define WP_hi PORTD.2=1
#define WP_lo PORTD.2=0
//
#define TWINT 0x80
#define TWEA 0x40
#define TWSTA 0x20
#define TWSTO 0x10
#define TWWC 0x08
#define TWEN 0x04
#define TWIE 0x01
//
// TW_MT_xxx - master transmitter
// TW_MR_xxx - master receiver
// TW_ST_xxx - slave transmitter
// TW_SR_xxx - slave receiver
//
#define TW_START 0x08
#define TW_REP_START 0x10
#define TW_MT_SLA_ACK 0x18
#define TW_MT_SLA_NACK 0x20
#define TW_MT_DATA_ACK 0x28
#define TW_MT_DATA_NACK 0x30
#define TW_MT_ARB_LOST 0x38
#define TW_MR_ARB_LOST 0x38
#define TW_MR_SLA_ACK 0x40
#define TW_MR_SLA_NACK 0x48
#define TW_MR_DATA_ACK 0x50
#define TW_MR_DATA_NACK 0x58
#define TW_ST_SLA_ACK 0xA8
#define TW_ST_ARB_LOST_SLA_ACK 0xB0
#define TW_ST_DATA_ACK 0xB8
#define TW_ST_DATA_NACK 0xC0
#define TW_ST_LAST_DATA 0xC8
#define TW_SR_SLA_ACK 0x60
#define TW_SR_ARB_LOST_SLA_ACK 0x68
#define TW_SR_GCALL_ACK 0x70
#define TW_SR_ARB_LOST_GCALL_ACK 0x78
#define TW_SR_DATA_ACK 0x80
#define TW_SR_DATA_NACK 0x88
#define TW_SR_GCALL_DATA_ACK 0x90
#define TW_SR_GCALL_DATA_NACK 0x98
#define TW_SR_STOP 0xA0
#define TW_NO_INFO 0xF8
#define TW_BUS_ERROR 0x00
//
interrupt [TWI] void TWI_isr(void){
unsigned char status;
status=TWSR&0xF8;
switch(status){
// Slave Receiver status codes
case TW_SR_SLA_ACK: // 0x60: own SLA+W has been received, ACK has been returned
case TW_SR_ARB_LOST_SLA_ACK: // 0x68: own SLA+W has been eceived, ACK has been returned
case TW_SR_GCALL_ACK: // 0x70: GCA+W has been received, ACK has been returned
case TW_SR_ARB_LOST_GCALL_ACK: // 0x78: GCA+W has been received, ACK has been returned
// we are being addressed as slave for writing (data will be received from master)
TWCR|=TWINT;
break;
case TW_SR_DATA_ACK: // 0x80: data byte has been received, ACK has been returned
case TW_SR_GCALL_DATA_ACK: // 0x90: data byte has been received, ACK has been returned
UDR0=TWDR;
TWCR|=TWINT;
break;
case TW_SR_DATA_NACK: // 0x88: data byte has been received, NACK has been returned
case TW_SR_GCALL_DATA_NACK: // 0x98: data byte has been received, NACK has been returned
TWCR|=TWINT;
break;
case TW_SR_STOP: // 0xA0: STOP or REPEATED START has been received while addressed as slave
// switch to SR mode with SLA ACK
TWCR|=TWINT;
break;
}
}
//
void main(void){
UCSR0B=8; UBRR0L=8; // 115200 @16MHz 송신
TWSR=0; TWAR=0x56; TWCR=TWEA|TWEN|TWIE;
SREG=0x80;
while(1){}
}
웹검색해서 찾은 소스를 조금 수정해서 만들었습니다.
댓글 0
조회수 2,669등록된 댓글이 없습니다.