통신 > TWI - 단방향 통신 (구구단) - 수신 함수

TODAY992 TOTAL2,585,164
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 통신 | I2C-IIC,TWI | TWI - 단방향 통신 (구구단) - 수신 함수

페이지 정보

작성자 키트 작성일2017-09-01 10:54 조회2,135회 댓글0건

본문

 

3660040649_hoQtNabr_20131227-5.PNG3Ftype3Dw740

 

두대의 K128LCD 키트를 사용해서 TWI 통신을 해봤습니다.

저가의 128모듈 두개로도 가능합니다.

 

PD0,PD1에 풀업저항 1K 두개를 사용했고

128  PD0 ----------(1K풀업)-------> PD0 128 UART0 TXD ---> (115200) 하이퍼터미널

     PD1 ----------(1K풀업)-------> PD1

이런식으로 연결해주면 됩니다.

 

//----------------------------------------------------------------------

// TWI 마스터 송신

//----------------------------------------------------------------------

#include
#include
#include
//
#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 
//
char str[20];
//
void TWI_Page_WRITE(int add){
    unsigned int i;
    WP_lo;
    TWCR=TWINT|TWSTA|TWEN;     while(!((TWCR&TWINT)&&(TWSR&TW_START)));       //START Complete ?
    TWDR=add; TWCR=TWINT|TWEN; while(!((TWCR&TWINT)&&(TWSR&TW_MT_SLA_ACK)));  //Slave Address Write Mode Complete?
    for(i=0;i<12;i++){ TWDR=str[i]; TWCR=TWINT|TWEN; while(!((TWCR&TWINT)&&(TWSR&TW_MT_DATA_ACK))); } 
    TWCR=TWINT|TWSTO|TWEN;    //stop
    WP_hi; 
}
//
void main(void){
    char a,b;
    //
    TWBR=72; TWSR=0; //TWPS=0 => 4^TWPS=4^0=1 // 100kHz               
    while(1){
        for(a=2;a<=9;a++)
            for(b=1;b<=9;b++){ sprintf(str,"%d x %d = %2d\r\n",a,b,a*b); TWI_Page_WRITE(0x56); } //12byte
        delay_ms(100);
    }
}
//----------------------------------------------------------------------

송신 코드는 앞장의 시리얼 EEPROM 강좌에서 많이 본 소스일겁니다.

구구단 1라인에 12바이트씩 전송합니다.

 

 

 

//----------------------------------------------------------------------

// TWI 슬레이브 수신

//----------------------------------------------------------------------

#include
#include
#include
//
#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 
//
void twi_slave_read(void){
    char i;
    TWCR=TWEA|TWEN; while(!((TWCR&TWINT)&&(TWSR&TW_SR_SLA_ACK)));
    for(i=0;i<12;i++){
        TWCR=TWINT|TWEA|TWEN; while(!((TWCR&TWINT)&&(TWSR&TW_SR_DATA_ACK)));
        UDR0=TWDR;
    }
    TWCR=TWINT|TWEA|TWEN; while(!((TWCR&TWINT)&&(TWSR&TW_SR_STOP)));
    TWCR=TWINT|TWEA|TWEN;
}

//
void main(void){
    UCSR0B=8; UBRR0L=8; // 115200 @16MHz 송신
    TWSR=0;   //TWPS=0 => 4^TWPS=4^0=1 // 100kHz               
    TWAR=0x56; 
    while(1){
         twi_slave_read();
    }
}

//----------------------------------------------------------------------

 

TWI는 100KHz 9비트, 1바이트 전송시간 = 90us

UART0는 115.2KHz 10비트 = 87us

UART 전송속도가 조금 더 빠르고, TWI처럼 스타트와 스톱등이 없으므로

UDR0=TWDR;

TWI에서 수신하는대로 바로 바로 UART로 송신 해도 됩니다.

TWI 속도를 올려서 UART속도가 더 느리다면 UART 전송이 복잡해집니다.

 

댓글 0

조회수 2,135

등록된 댓글이 없습니다.

통신HOME > 통신 > 전체 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기