BASIC4MCU | 통신 | I2C-IIC,TWI | TWI - 단방향 통신 (구구단) - 수신 함수
페이지 정보
작성자 키트 작성일2017-09-01 10:54 조회2,135회 댓글0건본문
두대의 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등록된 댓글이 없습니다.