# CAN이란?


 CAN 몇 년도에 만들어지고 누가 만들었고와 같은 이야기는 각자 게시물 아래 참고 사이트에서 확인하시길 바라고, 해당 이야기는 배제하고 제 나름대로 간단하게 정리해 보겠습니다. CAN은 알려진 바와 같이 자동차에 있는 다양한 노드를 제어하기 위해 탄생한 통신 프로토콜 입니다. 기존 RS-232나 485와 같은 시리얼 통신방식이고 비동기식 입니다. 다만 앞서 말씀드린 통신 프로토콜은 물리계층(Layer 1)부분만 명시되어 있지만 CAN의 경우에는 OSI 7계층 기준으로 볼 때 물리 계층(Layer 1)과 데이터 링크 계층(Layer 2)을 정의 하고 있습니다. 데이터 링크 계층을 정의하고 있기 때문에 에러에 대한 처리가 확실하기 때문에 상당히 안정성이 높은 프로토콜이 되겠습니다.


간단하게 특징을 RS-485와 비교하여 살펴보면 다음<표 1>과 같습니다.


<표 1> CAN 및 RS-485 비교

특징 / 통신 프로토콜

CAN

RS-485

토폴로지

Bus / Multi-point

Bus / Multi-point

통신 메소드

Master/slave, peer to

peer, multi-cast, multimaster

Master/Slave, Multi-master

통신 회선(전원 제외)

2-wire Twisted-pair / Differential

2, 4-wire Twisted-pair /

Differential

통신 속도

< 1Mbps

12Mbps 이하 또는 이상

에러처리

O (5가지의 에러 처리)

X

(상위 프로토콜을 이용한

수동적 에러처리)

최대 노드

2의 29승

256

최대거리

25-1000m

1.2km


직접적인 비교 대상이 아니라고 할 수도 있지만 일단 비교를 해보면 비슷합니다.


 먼 저 둘 다 버스형의 토폴로지 형태입니다. 쉽게 말하자면, 하나의 회선에 다수의 디바이스가 연결 된 형태로 디바이스가 증가하더라도 따라 회선 추가로 요구되지 않는 저비용 측면에서 유리한 토폴로지 구조입니다. 기본적으로 멀티 캐스트나, 브로드 캐스트가 가능하며, 디바이스의 구분은 어드레스 방식을 사용하게 됩니다. 다만 하나의 어떤 디바이스가 회선을 액세스 한 상태에서는 그 외의 디바이스는 회선을 사용할 수 없기 때문에, 스타형에 비해 실시간성이 떨어질 수 있는 단점이 있고, 서로 전송을 시도할 경우 이더넷과 같이 신호 충돌이 발생할 수 있습니다.

 하지만 버스형태가 산업 현장에서 각광을 받는 이유는 회선 즉, 설비 비용이 적게 작용하기 때문에 대부분의 산업용 필드버스는 버스형을 기본적으로 채용 하고 있습니다. (CAN, CC-LINK, Modbus, Profibus, Foundation Fieldbus 등등)


 통신 방식은 기본적으로 두 통신 프로토콜의 물리 계층이 버스형에 멀티 포인트(n:n)이기 때문에, 사실상 통신 방식은 상위 프로토콜의 정책에 따라 달라질 뿐 거의 같다고 볼 수 있습니다.


 통 신 회선은 RS-485와 같이 Twisted-pair에 Differential 방식을 기본으로 하고 있습니다. 노이즈에 강한 형태로서, 두 라인의 전압차를 논리의 기준으로 삼기 때문에 노이즈로 인해 두 라인의 전압이 변경되어도 기본적으로 두 라인의 전압차는 달라지지 않으므로 노이즈 특성을 적게 받습니다. (더 자세한 부분은 검색해서 보세요 ^^;)


 에 러처리는 CAN의 경우 자동차라는 매우 열악한(다이나믹 하고 거친) 환경을 고려하였기 때문에 물리계층에서 부터 데이터 링크 계층까지 에러에 대한 대비가 잘 되어 있습니다. CAN은 이러한 에러처리를 하드웨어에서 대부분 해주는 장점이 있습니다. ( 이부분은 확실한 검증이 필요합니다. 아시는 분들은 이야기를) 물론 RS-485의 경우에도 해당 레이어 프로토콜 스택을 MCU에 펌웨어 형태로에 올려주면 되지만(대표적으로 MODBUS), 아무래도 그럴 경우에는 하드웨어에서 자동으로 처리해주는 것보다 고려사항이 많아지고 검출할 수 있는 에러가 데이터로 한정되며, 계산적인 오버헤드가 크게 작용합니다.


 통신 속도나 최대 노드, 거리 등은 이론상으론 해당 수치보다 높을 수 있지만.. 상황에 따라 다르므로 설명은 생략합니다.


 이와 같이 물리적인 특징위주로 CAN을 살펴보았는데요.. 이를 한번 더 간단히 정리하자면..

CAN은 노이즈와 에러처리에 강력한 산업 통신 프로토콜이라는 것을 알 수 있었습니다.



용어정의

 

필드버스(Fieldbus) : 산업용 프로토콜을 전반적으로 부를 때 사용하는 말, 그러나 Foundation Fieldbus는 필드버스를 지칭하는 것이 아니라 필드버스 프로토콜 중 하나이다.

 

CSMA/CD : (Carrier Sense Multiple Access with Collision Detection)

 Ethernet에 이용되고 있는 통신 방식으로, 발신하려고 하는 노드가 충돌을 회피하기 위해 다 른 노드가 발신하고 있지 않는가를 캐리어 신호로 검출한다. 검출했을 경우, 어느 노드도 소정 시간 대기 후 발신을 재시행한다.


CSMA/NBA : (Carrier Sense Multiple Access with Non-destructive Bitwise Arbitration)

 DeviceNet 로 이용되고 있는 통신방식. CSMA 방식으로 각 노드의 우선도를 가미한 룰을 부가해 통신 충돌을 회피하는 방식이다. CSMA/CD 방식은 버스가 일시적으로 모두 비우기 위해 효율이 저하하는데 대해, CSMA/NBA에서는 어느 쪽인가가 발신을 하므로 버스 사용 효율이 높다.



본 내용은 CAN 스펙의 PART B를 중심을 작성되었음을 밝힙니다.


1. CAN 프로토콜의 구성

 

the Data Link Layer

   - the Logical Link Control (LLC) sublayer

   - the Medium Access Control (MAC) sublayer

the Physical Layer

[그림 1] CAN 프로토콜 구조


 CAN 은 2개의 계층으로 구성 된 프로토콜입니다. 우리가 일반적으로 알고 있는 RS-232와 RS-485 등이 Layer 1에 해당하는 물리 계층(Physical Layer)만 해당 된다면, CAN은 Layer 1 뿐만 아니라 Layer 2인 데이터 링크 레이어(Data Link Layer)도 포함을 합니다. 보통 우리가 UART 물리 계층 프로토콜 레이어를 기반위에 펌웨어로 간단하게 데이터 링크 계층을 적절하게 작성하였다면, CAN은 이것을 기본 스펙으로 정의를 하고 있다는 점 입니다.

 그래서 CAN 트렌시버에서 프레임 형식이 아마 고정되어 있고 MCU에서는 트렌시버의 데이터 필드 영역에 정해진 크기만큼만 데이터를 쓸 수 있을 거라 봅니다.(이부분은 직접 해보신 분들이 지적 해주세요 ^^;) 이 점은 CAN의 데이터 링크 계층 스펙에 구속을 받는다는 단점이 있지만, 데이터 링크 계층까지 트랜시버에서 하드웨어로 대부분 구성이 되어있을 것이므로 데이터 링크 레이어 스택을 작성해야하는 수고를 덜어줌과 동시에 고려사항이 적어지게 됩니다. 또한 Layer 2에서 MAC 부분 그림을 보시면 기존 소프트웨어 방식으로 작성하는 Layer 2에 비해 다양한 에러 처리가 가능함을 볼 수 있습니다. 참고로 CAN에서는 5가지 정도의 오류 발견할 수 있습니다.


2. CAN 프로토콜의 간략한 특징


 CAN 프로토콜은 다양햔 특징을 갖고 있는데 몇가지를 나열하면 아래와 같습니다.

 

메시지의 우선순위

 CAN 은 메시지에 우선 순위를 갖습니다. 이는 무엇을 의미하냐면, 만약 두 개 이상의 노드가 메시지 전송 시 버스 기반이기 때문에 신호 충돌이 나고, 이럴 경우 문제가 생깁니다.(RS-485는 죽는다고 하더군요..) 그러나 CAN 버스는 이를 알아차리고 재 전송을 요구합니다. 이더넷은 신호 충돌이 난 두 노드 각각 일정 시간 후 재 전송을 요청하지만, CAN은 충돌난 메시지 중 우선 순위가 높은 경우에는 우선순위 높은 메시지가 우선 전송이 되고 낮은 메시지가 일정 시간 후 재 전송을 시도 하게 됩니다.(CSMA/NBA)이는 기존 이더넷 방식의 CSMA/CD 보다 실시간성이 높고 빠른 반응 속도를 갖을 수 있는 장점이 있습니다. 메시지 우선 순위는 메시지 프레임에서 IDENTIFER 필드 부분의 값이 적을 수록 높은 우선순위를 갖습니다.

 

• 시스템 유연성

 노드가 추가 되거나 제거 되더라도 소프트웨어 또는 하드웨어를 변경없이 적용이 가능한 장점을 갖고 있습니다.


• 메시지 라우팅

 CAN 은 조금 특별하게 메시지 프레임에 주소를 포함하고 있지 않습니다. 기본적으로 멀티캐스트로 전송하면서 해당 노드는 메시지 프레임에 포함됨 해당 IDENTIFIER를 보고 자신에게 필요한 데이터일 경우 수신받고 그렇지 않을 경우 배제를 합니다.


멀티캐스트 수신

 기본적으로 버스형 토폴로지를 하고 있기 때문에 한 노드가 전송한 데이터는 모든 노드에게 전달 됩니다. 그렇기 멀티캐스트로 한번에 데이터를 전송할 수 있습니다.

 

멀티 마스터

 CAN은 기본적으로 메시지 충돌 회피를 지원하기 때문에 마스터에 의한 폴링 방식으로 데이터를 전송할 필요가 없습니다. 어느 노드든지 원하는 시간에 자유롭게 메시지를 전송하고 수신할 수 있습니다.

 

에러 검출 및 복구

 CAN은 다양한 에러를 검출 할 수 있습니다. CAN 자체로도 5가지 정도의 에러를 검출 할 수 있고 복구가 가능하기 때문에 신뢰성 있는 데이터 전송이 가능합니다.

 

훼손된 데이터 자동 재전송

 데이터가 정상적으로 전송이 되었더라도 데이터 자체가 훼손이 되거나 이상이 있을 경우 이를 자동적으로 재전송 할 수 있습니다.

 

일시적인 에러 및 지속적인 에러를 구분 검출하여 격리

 버스형 토폴로지에서는 에러를 발생시키는 노드는 상당히 문제가 됩니다. CAN에서는 3가지 정도로 에러를 발생시키는 노드를 구분하여 만약 문제가 많은 노드일 경우 CAN 버스에서 격리를 시킬 수 있습니다.



출처 : http://cafe.naver.com/micropc

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,
EEPROM(Electrically Erasable PROM)은 On-Board상태에서 사용자가 내용을 Byte단위로 Read하거나 Write 할 수 있으므로 사실상 SRAM처럼 사용 할 수 있는 불휘발성 메모리이다.(NVRAM, Non-Volatile RAM이라고 부르기도 한다.) 그러나, 이것의 Read 동작은 Access동작이 다소 느릴지라도 SRAM과 유사하므로 별 문제가 없는데 비하여, Write 동작을 수행하는 경우에는 1byte를 write 할 때마다 수 ms 이상의 시간지연이 필요하므로 SRAM과 동일하게 사용할 수는 없다. 따라서 EEPROM은 실시간으로 사용되는 변수를 저장하는 메모리나 스택 메모리로는 사용될 수 없으며, 한번 내용을 저장하면 비교적 오랫동안 이를 기억하고 있으면서 주로 이를 읽어 사용하기만 하거나 전원을 꺼도 지워져서는 않되는 중요한 데이터를 백업하여 두어야하는 설정값 저장용 메모리로 적합하다. 이 메모리 소자는 28Cxxx의 형태로 이름을 짓는 경우가 많다.



Flash Memory는 On-board 상태에서 사용자가 내용을 Byte단위로 자유로이 Read 할 수는 있지만, Write는 Page 또는 Sector라고 불리는 Block 단위로만 수행 할 수 있는 변형된 EEPROM이다. 블록의 크기는 Memory 소자나 Maker에 따라 다르지만 대체로 64Byte, 128Byte, 246Byte 등에서 부터 128KB까지도 사용한다. 이렇게 Flash Memory는 EEPROM과 매우 유사하지만 Byte단위로 Write하는것이 불가능하므로 Page mode write 기능만 가지는 EEPROM이라고 생각하면 되며, 따라서 역시 SRAM처럼 실시간 Data memory로 사용하는 것은 불가능하다. 그러나, Flash memory는 EEPROM보다 Memory Cell 구조가 간단하여 휠씬 대용량의 메모리 소자를 만드는데 적합하며, 1개의 Block 전체를 Write하는데 수 ms 정도가 걸리므로 대용량 Data를 Write할 때는 EEPROM보다 훨씬 빠르다는 장점을 가진다.



그런데, Flash memory는 내부 구조에 따라서 NOR형 Flash와 NAND형 Flash memory로 나누 수 있다. NOR형 Flash는 다른 Memory 소자와 같이 외북 구자가 Address bus, Data bus, 그리고 몇가지의 제어신호 및 전원으로 되어 있어서 프로그램 저장용으로 널리 사용된다. NOR형 Flash memory는 대부분 29Cxxx 형태의 이름을 가지고 있다. 그러나, NAND형 Flash memory는 Address bus와 Data bus가 따로 있는 것이 아니고 8개(또는 16개)의 Data 신호와 몇 개의 제어신호 및 전원핀을 가지고 있다. 8개의 Data 신호선은 Address 및 제어명령을 Write하거나 Data값을 읽고 쓰는 용도로 사용된다. 이렇게 하면 Memory를 읽고 쓴느 동작은 좀 번거로워지지만 Memory 용량이 증가하더라도 핀 수가 늘어나지 않으므로 하드웨어 규격을 통일 할 수있어서 Flash memory를 마치 Hard disk처럼 사용하는 것이 가능하다. 특히, 요즈음에는 휴대용 기기를 염두해 두고 1.8[V]나 3.3[V]의 저전압에서 동작하는 수십 MB~ 수 GB짜리 대용량의 NAND형 Flash memory가 많이 개발되어 휴대용 통신기기, 디지털 카메라, MP3 Player, 이동형 USB Memory등과 같은 용도에 널리 사용되고 있다.



참조: AVR ATmega128 마스터, 44Page (Oho사, 윤덕용 저)

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,

개요

과학 기술의 발전 및 전기 전자기기의 사용증가와 더불어 FA, OA, 시스템의 대규모화등 컴퓨터화에 의해 전자 장치의 역할이 더욱 크게 되었고, 정보를 고속으로 교환하는 다양한 정보 통신망의 실현에 따라 이용 주파수 스펙트럼도 확장되었다.

텔레비전, 라디오 등과 같이 전파를 수신해서 기능을 발휘하는 제품이나 컴퓨터와 같이 MHz대의 펄스를 사용하는 제품에서는 환경 오염의 일종인 전자파가 존재하는데, 이 전자파가 공간으로 방사 또는 전원 코드를 통해서 다른 제품에 영향을 줄때 이러한 전자파를 『노이즈』또는 EMI(Electro Magnetic Interference)라 한다
.

이러한 노이즈는 전기 전자기기의 목적과 기능을 방해하는 불필요한 전기적 에너지라 할 수 있으며 이런 장해 전자파가 발생하는 이유는 반도체와 디지털기술의 발전으로 부품이 소형화, 고밀도화, 고속도화로 짧은 시간에 전압이나 전류가 급격하게 변화하기 때문이다

 

1.      노이즈의 종류

 

노이즈는 전기를 띤 구름이 뇌방전을 일으킬 때 발생되는 『자연노이즈』와 사람이 장치등을 사용할 때 부수적으로 발생되는 『인공노이즈』로 크게 분류되며, 자 연노이즈는 구름의 기단 사이에 기상 변화가 심할 때 낙뇌가 송전선 또는 통신 회선등에 직접 인가 되었을때 발생하는 직격 뇌써지와 뇌방전시에 구름과 구름 사이 또는 구름과 대지 사이에서 대전된 전하가 소멸되는 현상 즉 매우 큰 방전류에 의한 유도 현상으로 인하여 송전선이나 통신회선등에 이상 전압이 발생하는 유도뇌써지 등이 있다.

인공노이즈는 『방사노이즈』와『전도노이즈』가 있으며, 방사노이즈는 방송이나 휴대 무선기등의 통신용 전파에 의한 장해는 물론 송전선의 코로나 방전, 오토바이의 점화시의 노이즈 등 공간으로 직접 피해측에 전파하는 것이고, 기기나 회로간을 연결하는 신호선이나 제어선, 전원선 등이 본래 전송해야 할 신호들과 달리 이들 도선을 통해 피해측에 유도되는 전자파를 전도노이즈라 한다.

전도노이즈Transient, Impulse 등과 같이 전원선을 타고 들어와 Line간을 왕복하는 『노멀 모드 노이즈(Nomal Mode Noise)와 전원선을 타고 들어온 뒤 Earth Line을 타고 나타 나거나 그 반대의 경우와 같이 Line Earth간에 전달되는 커먼모드 노이즈(Common Mode Noise) 구분되며, 노멀 모드 노이즈는 대부분 짧은 시간에 높은 전압을 주고 사라지는 것으로 기기는 예고없이 에러를 내게되고 특히 전송중에 있는 데이터는 치명적이 될 수 있으며, 커먼 모드 노이즈는 Ground를 기준 전위로 채택하는 Logic 회로가 내장된 전자기기나 Memory계통에 에러를 유발 시킬수 있다.

 

2.      노이즈 대책

 

기기들이 서로 조화를 이루어 공조할 수 있는 능력을 적합성( EMC:Electro Magnetic Compatibility ) 이라 하며 EMC EMI EMS로 구성되며, 노이즈 문제를 해결하기 위해서는 두가지 방법으로 접근할 수 있는데, 하나는 불용전자파의 방사를 억제하는 것이고(EMI:Electro Magnetic Interference, 전자파장해) 다른 하나는 어느 정도의 전자파 환경내에서도 그 장해를 견디며 정상적으로 동작할 수 있도록 내성(EMS:Electro Magnetic Susceptibility)을 강화시키는 방법이다.

노이즈 문제가 발생하려면 다음의 3가지 요소가 반드시 조합되어야 하며 이중 어느 하나만이라도 제거 되면 문제가 발생하지 않는다.

 

효과적인 EMI 노이즈 대책이란 회로 메카니즘의 적절한 밸런스를 이루는 것으로 좁은 영역에서의 EMC를 말하는 것이라 할 수 있으며, 이와 같은 노이즈를 저감하기 위한 실제 기술로는 접지(Grounding), 필터링(Filtering), 차폐(Shielding) 등이 있다.

1)접지기술

전자 기기 내부의 접지는 신호 그라운드(SG)와 프라임 그라운드(FG)로 나누어 볼 수 있는데, 노이즈에 의한 트러블은 이와 같은 SG계통과 FG계통의 레벨 변동이 원인인 경우가 많다.
SG
는 회로 전류를 귀환시키는 그라운드이므로, 전류가 흐르는 그라운드이고, FG는 전류가 흐르지 않는 그라운드로서 FG에 전류가 흐르면 외부로 노이즈 방사의 원인이 되기도 하고, 외부의 전자계에 대한 감수성을 높이기도 한다.

따라서 어스회로의 임피던스를 가능한 적게 하고. 어스회로에 전류가 흐르지 않게 하며, 또한 그라운드 루프를 형성하지 않도록 하는 것이 기본이다.

 

2)Lay-out

전자 부품 및 내부와이어 같은 것들의 Lay-out 이 의외의 노이즈 특성을 좌우하는 경우가 많다. 기본적으로 전기적인 성격이 다른 부분은 분리하는 것이 좋다.
예를 들어

입력 <-> 출력, 디지털 <-> 아날로그, 고속 <-> 저속, 고압 <-> 저압, 저임피던스 <-> 고임피던스 를 분리하여 부품배치와 배선패턴을 최적화하여 용량결합, 유도결합, 공통 임피던스 결합에 의한노이즈 발생 메카니즘을 피하는 것이 좋다.

 

3)전자부품 선정

IC TR과 같은 능동소자, 콘덴서, 인덕터, 트랜스와 같은 수동소자 및 콘넥터, 스위치와 같은 기구품등의 특성, 성능을 노이즈 발생 메카니즘과 관련시켜 컴토하고 최적인 부품을 선정함으로서 노이즈에 대한 내력(Immunity)을 강화시키고 노이즈성분의 발생을 억제 시킨다.

 

4)차폐기술(Shielding)

차폐는 노이즈의 영향을 받고있는 회로나 기기의 장해 방지 수법 중 가장 근본적이고 넓게 사용되고 있는 방법으로 일반적으로 용량 성분적인 결합을 방지하는 것을 『정전쉴드』 , 자계 및 전자파에 의한 결합을 방지하는 것을 『전자쉴드』 라고하며, 정전쉴드는 알루미늄이나 동 등의 금속케이스나 쉴드 케이블을 사용하는 대책으로 낮은 레벨의 회로나 고주파 회로에 효과적이며, 전자쉴드는 외부로부터 자속의 영향을 받기 쉬운(또는 외부로 자속을 누설하기 쉬운) 트랜스, 인덕터와 같은 것을 니켈 등과 같이 고투자율 금속의 케이스를 사용하여 내부(또는 외부)에 대하여 자속의 침입이나 누설을 방지하는것이다.

 

5)필터기술(Filtering)

도체를 통해 전달되는 전도노이즈 및 자유공간으로 방사되는 방사노이즈에 대한 대책에서 양쪽 모두의 대표적인 방법으로 필터링 기술이 있다. 필터는 인덕턴스와 커패시턴스의 조합으로 구성되며 전원계에 사용되어지는 것과 신호계에 사용되어지는 것으로 구분된다. 전원용 필터는 고전압, 대전류에 견디도록 설계되어 일반적으로는 30MHz 이하의 낮은 주파수 대역에서 주로 사용되고, 통상 30MHz이상의 주파수 대역에서 적은 전류의 신호계에 사용되는 신호용 필터는 실제의 제품에 적용해보면서 각각의 경우에 맞는 최적의 필터를 결정하는 경우가 많다.

 

노이즈 관련 용어

A. RFI(Radio Frequency Interference)
『무선주파장해』로 무선통신의 통신장해, 혼신을 일컬음.

B. EMI(Electro Magnetic Interference)
『전자파장해』로 무선통신기기, 전자기기, 기계, 자동차 등 모든 물체에서 발생하는 직류에서 초고주파까지의 전자기 방해를 일컬음.
C. EMS(Electro Magnetic Susceptibility)
『전자파감수성』으로 기기가 외부방해의 영향을 얼마나 쉽게 받는지를 나타낸 것.

D. EMC(Electro Magnetic Compatibility)
『전자환경적합성』으로 EMI EMS를 합친 것.

 

EMI 규격

미국, EU등을 비롯한 선진 각국에서는 EMI에 대한 법적규제를 실시하고 있고 EMI문제를 해결하기 위하여 정확한 측정방법, 대책 기술 개발 등에 노력을 기울이고 있다.
이에따라 전기전자 제품의 수출시 반드시 해당국가의 EMI 규제에 통과하지 않으면 안되며, 주요 규격은 다음과 같다
.

CISPR (IEC
국제 전자파장해 특별위원회
)
FCC (
미국연방통신 위원회
)
VDE (
독일 전기기술자 현회
)   
VCCI (
일본정보처리장치 등 전자파장해 자주규제협의회)

 

1.NOISE FILTER의 개요

AC전원 라인은 외부의 노이즈가 전자기기로 침입하기도 하고, 전자기기의 내부에서 노이즈가 외부로 유출되는 경로가 된다.

또한 AC 라인 노이즈에는 라인간에 발생하는 『노멀모드노이즈(Normal Mode Noise)』와 양쪽 전원 라인과 그라운드 사이에서 발생하는 『커먼모드노이즈(Common Mode Noise)』 가 있다.

 

따라서 노이즈 필터는 이러한 두 종류의 노이즈를 제거하는 회로망이 필요하다.
노이즈 필터는 3종류의 부품으로 구성된 것이 일반적으로 각각의 부품은 노이즈의 모드와 주파수에 따라 커먼 모드 초크코일이 저역의 커먼 모드 노이즈를 제거하고, 어크로스 라인 콘덴서가 저역의 노먼 모드 노이즈를 제거하며, 또한 라인 바이패스 콘덴서는 고역의 커먼 모드와 노멀모드 양방의 노이즈 제거 역할을 한다
.

커먼모드 초크코일은 1개의 폐자로 Core에 동일한 인덕턴스의 코일을 반대방향으로 감아서 부하에 공급하는 전류에의한 코아의 포화를 방지하고(자속을 서로 상쇄시킴) 커먼 모드 노이즈에 대해서는 인덕터로 동작하며, 라인 바이 패스 콘덴서는 라인과 프레임 그라운드간에 접속하는 콘덴서이다.

 

2 사용상 주의사항

1)NOISE FILTER는 기기의 입출력 단자와 가장 가깝게 접속해야 하며, NOISE FILTER
입출력선은 서로겹치지 않도록 하여 NOISE FILTER의 감쇄 특성이 최대한 발휘되도록 한다.

2)NOISE FILTER
를 기기에 장착할 때는 가능한 고주파 저항을 최소화 하여야 하며
,
이를 위하여 금속 케이스의 NOISE FILTER를 접속할 때는 기기의 접속부분의 도장성분을 제거하여 전기 전도성을 좋게하며, 접지 단자가 있는 NOISE FILTER는 반드시
NOISE FILTER
의 접지 단자와 가장 가까운 거리에 접지한다.

3)
고전압의 SURGE IMPULSE가 침투할 우려가 있는 경우에는 NOISE FILTER 앞단에

SURGE ABSORBER
를 사용하는 것이 좋다.

4)NOISE FILTER
의 전압, 전류 정격 이내에서 사용하여 NOISE FILTER의 성능 및 신뢰성이 떨어지지 않도록 한다.

 

EMI Filter (Noise Filter)의 의미
Noise란 원하지 않는 신호를 말합니다.
특히, 전기전자 분야에서 노이즈는 불요전자파를 말합니다. 불요전자파는 전원선을 통해 다른 기기에 영향을 주는 전도노이즈(CE)와 공기중을 통해 다른 기기로 전달되는 방사노이즈(RE)가 있습니다.전기를 소비하거나 생성하는 모든 기기들은 전자파를 발생시키고 또 전자파의 영향을 받기도 합니다.컴퓨터와 주변기기들을 예로 들어 보면, 컴퓨터는 같은 전원 (Power Source)을 사용하는 TV, 선풍기, VTR, Lamp, 전동드릴에 전원선과 공기중을 통해 전자파의 영향을 주기(Emission)도 하고 그들로부터 전자파의 영향을 받기(Susceptibility)도 합니다
.

 

EMI Filter의 역할

 

EMI Filter는 기기의 전원 입력단에 설치되며 기기에서 방출되어 전원선을 통해 빠져나가는 불요전자파를 차단, 흡수, 대지로 Bypass 시켜주는 전자부품입니다.

-                                  EMC : Electromagnetic Compatibility(전자기 양립성)
- EMI : Electromagnetic Interference (
전자기 방해
)
- EMS : Electromagnetic Susceptibility(
전자기 감수성
)
- CE : Conducted Emission (
전도 방출
)
- RE : Radiated Emission (
방사 방출
)
- CS : Conducted Susceptibility(
전도 감수성
)
- RS : Radiated Susceptibility(
방사 감수성)

 

Permissible noise limits(노이즈 허용 규격치)
다양한 규격들이 전도 EMI에 대한 규격치를 설정하고 있다. 이러한 규격치들은 전압으로 측정되고 dB ㎶로 값이 주어진다. 여기서 0dB 1㎶이다
.
이 전자파 간섭은 Bandwidth Receiver로 불리우는 측정 계측기를 사용하여 측정되고, 이 두 가지 수신기들은 Quasi-peak(준첨두) detector Average(평균) detector로 사용된다
.
측정의 반복성을 유지하기 위해 main 전원의 impedance는 일정해야 한다. 규격에서는 인공 주전원 회로망이라고 하며 때로는 전원 임피던스 안정화 회로망(LISN)이라고 불리기도 한다.- 이것은 noise에 규정된 impedance를 실어주고 또 측정에 영향을 줄 수 있는 주전원에 대한 noise를 걸러준다
.

그림 1은 유럽 주거지역, 상업지역과 경공업 환경의 일반적인 기준을 보여준다
.
그림 2는 유럽 공업환경의 일반적인 기준을 보여준다.

30MHz이상에서는 전도 noise 대신 방사 noise 간섭을 측정한다. 이것은 지정 안테나를 사용하여 Open field site에서 측정된다.

 

Interference sources and spectrums
전도 EMI의 가장 일반적인 요인은 SMPS, PWM, Frequency Converter 또는 Motor drive Phase angle controller와 같은 전력전자 제품들이다
.
방사 spectrum은 일반적으로 낮은 주파수에서 매우 크게 발생한다. 그리고 주파수 증가에 따라 줄어든다
.
Noise
가 수용할 수 있는 규격치 이하로 떨어지는 point는 여러 가지 요인에 따르며, 가장 주요한 요소는 동작주파수와 반도체 부품의 rise time이다.

 

Interference propagation (간섭의 전달)
EMI
는 두 가지 방법으로 전달 된다
.
By radiation (
방사) - 에너지가 있는 곳에서는 자기장 또는 전기장을 통해서, 또는 source와 피간섭물 사이의 전자파로써 서로 결합될 수 있다
.
By conduction (
전도) - EMI energy는 전력 공급 선과 data cable을 따라 전파된다.

방사와 전도 EMI는 전체적으로 분리된 문제로 생각할 수 없다.
Cable
에 전도된 noise antenna로 작용하는 cable로 인해 방사될 것이다. 그 방사는noise의 파장과 비교하여 상대적으로 cable의 길이에 따라 증가할 것이다. 역시, cable은 수신 antenna로써 작용하여 방사 noise를 받아들이게 된다.

150MHz 부근 이하에서, system 내에서의 가장 영향을 미치는 방사 발생 부품들은 일반적으로 전원 공급 장치와 신호선들이다. 이러한 cable들의 적절한 filtering cable의 전도 noise 방사를 줄이는 것이다.
150MHz
이상에서, PCB 트랙과 짧은 내부의 cable들은 효과적인 안테나로 작용한다
.
PCB
의 방사를 감소시키기 위해서는 트랙의 길이와 루프의 면적을 감소시켜야 하고, 가능하면 접지판을 사용하여야 한다. Digital IC의 분리는 매우 중요하며 shield 처리도 요구될 것이다
.

Interference types(간섭의 종류)
전도 EMI와 연관된 문제들을 이해하기 위해서는 먼저 전도 noise의 두 가지 mode를 이해할 필요가 있다. , Differential mode-또는 symmetrical(대칭) mode common mode-또는 asymmetrical(비대칭) mode 이다
.
Differential mode noise
는 시스템의 상간에서 전압을 발생시키고 대지와는 무관하다.

대칭 모드 전류는 한 상을 따라 흐르고 다른 상을 따라 돌아 나온다.

Common mode noise는 각각의 상과 대지사이에 전압을 발생 시킨다. 비대칭 모드의 전류는 earth path(일반적으로 기생 capacitance)를 따라 noise원으로부터 대지로 흐르고 다시 각 상으로 돌아 온다. (그림 3. VCM) 전원라인 필터는 common mode differential mode noise를 함께 감쇄할 수 있도록 설계되어야만 한다.

 

Mains filters
최대 전력 전송은 전원과 부하 impedance가 일치했을 때 발생한다. Power line filter impedance 사이의 최대 불일치 발생을 목적으로 하는 inductor capacitor 회로망이다. 그러므로 noise source에서 전원 line cable로 전송되는 EMI 간섭량을 줄일 수 있다
.
 

Inductor L1 L2 -전류를 보상하는 형태로- 일반적으로 toroidal core에 감는다.
이 권선법은 differential mode current mains current를 서로 상쇄시키도록 자속을 발생시키고, 반면 common mode current는 배가가 될 것이다. 이것은 common mode current에 큰 inductance를 주고, 주전원 current에 의해 생성되는 큰 자속(magnetic flux)에 의해 inductor가 포화 되는 것을 막아준다
.
각 상간에 위치하는 X class capacitor라고 말하는 capacitor들은 높은 pulse 정격 전압을 가져야 하고 differential mode interference를 감쇄 시키는 데 사용된다. 상과 earth 간의 Y class capacitor로 알려진 capacitor들은 좀더 엄격한 등급이어야 하고 common mode interference를 감쇄 시키는 데 사용된다. Y capacitor의 용량은 허용 누설전류에 따라 제한된다.최대 누설전류는 규격과 법규와 장비의 형식에 의해서 제한된다.

누설전류는 다음에 의해서 주어진다.
lL=2
πUf
C
IL -
누설 전류

U - Capacitor
전압

f -
주전원의 주파수

C - Capacitor
용량

전원용 filter는 고주파 interference filter를 우회하지 않도록 가능하면 전원 입력부 가까이 설치 되어야 한다. IEC inlet module은 이 목적에 적합하도록 이상적으로 맞게 되어 있다.

높은 감쇄 또는 동작 주파수 범위에서의 효과를 증가시키기 위해 그림 4에서 보여주는 1단 회로보다 좀더 복잡한 filter를 여러 개의 common mode 또는 differential mode inductor 그리고 capacitor들을 사용하여 만들 수 있다.

 

Filters with earth line chokes
시스템의 모든 케이블에 전자파 간섭이 동시에 발생될 수 있다. 이 경우 earth cable에도 동일한 noise가 발생될 것이다.
표준 필터는 phase line noise를 감소시킬 수 있지만, 대지에 대해서는 그렇지 못하다. 접지선에 유기된 noise는 장비로 유입될 수 있고 장비의 장애를 발생시킬 수 있다. 이 간섭을 줄이기 위해 earth line choke를 장착하거나 filter와 조ㅜ 합한다. Earth line choke는 일반적으로 common mode current에 대한 별도의 감쇄효과를 줄 것이다.

시스템에서 earth line choke를 우회하지 않도록 주의가 필요하다. 예를 들어 PC earth line choke가 구성된 filter를 가지고 있을 것이다. 만약 이 PC main 전원으로부터 전력을 공급 받는 printer와 연결되어 있고, 만약 그 printer earth line choke가 없다면 noise는 아마도 주전원에서 printer로 가는 경로를 찾고 PC로 연결되는 신호선을 따라 PC안에 있는 earth line choke를 우회할 것이다.

EMC회로는 노이즈 필터이며, 인덕터(CHOKE), 캐패시터(CAPACITOR)로 구성되었다.

 인덕터는 Noise filter의 가장 중요한 부품이며 Normal mode choke Common mode

 choke로 나뉜다.

  Normal mode choke Iron powder가 주로 사용되며 이 코아는 포화 자속밀도가 높을

  뿐 아니라 투자율이 작은 대신 주파수 대역폭이 넓으므로 Line cross capacitor(X CAP)

  와 조합하여 Normal mode noise를 효과적으로 억제한다.(자속을 한 방향으로 가지게

   winding 한다).

  Common mode choke는 투자율이 크고 hysterisis 손실이 적은 페라이트 코아를 사용하여 자속이 합하여 지도록 winding하여 Line to ground capacitor(Y capacitor)와 결합하여 사용하면 Common mode noise를 억제 할 수 있다.


WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,

회로를 꾸미다 보면 여러가지의 기능을 하는 모듈이 한 회로속에 들어가게된다. 한 회로속에 들어가게 된다는 것은 전원과 접지를 공유 하게 된다는 것이다.

 

그렇게 되면 어느 한 모듈에서 고주파 신호를 만들어 내게 된다면 그 신호가 다른 모듈에 영향을 미쳐서 그야말로 미쳐 버린다. 기판을 보면 모든게 다 얽혀 있는것 같지만 잘 보면 나름대로 기능별로 나뉘어 있다. 다만 전원과 접지를 공유하기 때문에 모든 회로가 얽혀 있는것 처럼  보이기 쉽상이다.

 

모듈간의 간섭 문제는 로봇같은 걸 만들다보면 필히 겪게된다. 여러 종류의 센서를 쓰게 되기 때문에 이 센서 회로가 저 센서 회로에 영향을 미치는 일이 생기는 것이다.

 

내 경우는 적외선 거리 센서를 달았더니 적외선 동작감지 센서에 엄청난 규칙적 노이즈가 끼는 문제가 있었다. 게다가 적외선 동작감지 센서 회로에는 아주 잘 필터링 된 떨림 없는 전류를 넣으라는 권장사항까지 있었다.

 

그러나 실험적인 방법(?)으로 필터회로에 들어갈 저항과 커패시터의 값을 찾기는 너무 어려웠다. 그래서 일단은 그걸 MCU에서 프로그램을 써서 연이은 6개 정도의 값을 평균내는 방식으로 노이즈를 줄여주는 기초적인 방식으로 해결했었다.

 

그것은 원하는 주파수대만을 걸러주는 필터회로를 어떻게 구성하는지 몰라서 프로그램을 쓸 수 밖에 없었다. 당시에는 여기 저기 찾아봐도 수식만 덜렁있을뿐, 예를 들어 계산을 해 놓은 곳이 한 군데도 없어서 수식에 뭘 넣어야 되는지도 모르는 나는 답답하기만 했다. 그런데 오늘 검색해보니 금방 나오네? TT

 

필터회로는 아래 그림 처럼 저항과 커패시터(콘덴서) 또는 저항과 코일의 조합으로 만들어 준다.

 


그림출처: MIT Open Course Ware, Anant Agarwaland Jeffrey Lang, course materials for 6.002

 

모듈로 들어오는 전원에 직렬로 저항을 연결하고 전원과 접지에 병렬로 전해 커패시터를 연결하면 간단한 로우패스 필터가 된다. 로우패스 필터는 특정 주파수 이하의 신호만 통과 시키는 회로이다. 그러니까 옆 회로에서 적외선 거리센서의 발진부처럼 40KHz의 발진을 일으키는 회로를 쓴다면 그 보다 좀 여유있게 낮은 10KHz이하의 신호만 통과시키는 회로를 달아 주거나 아예 확실하게 10Hz이하로 해버려도 좋을 것 같다.

 

방금도 누가 만들어 놓은 적외선 감지회로를 만들었는데. 회로도의 로우패스 필터보다 훨씬 더 낮게 했더니 겨우 제대로 작동하는 걸 보니 충분히 낮게 해주는게 좋은것 같다.

 

주파수 계산은 이렇게 한다고한다.

 

    필터링 주파수= 1/(2* 3.141592 * R * C )   

 

저항값은 그대로 넣고 커패시터는 보통 마이크로 패럿이니까 33uF(u는 마이크로의 의미로 쓴 것임)이면 0.000033 을 넣어야겠다.

 

내가오늘 만든 적외선 접근 센서회로에는 원래 저항은 50 오옴에 33uF의 커패시터를 쓰고 있었다. 계산해보니 1/(2 * 3.141592 * 50 * 0.000033) = 96.45756 이 나온다. 적외선 LED의 발진 회로는 40KHz를 쓰고 있으니 96Hz 정도면 센서회로 쪽의 전원으로 노이즈가 들어오지 않도록 충분히 커버를 해줘야 되는, 그러지 못했다.

 

그것은 아마  필터회로가 깔끔하게 어느 주파수이상 이하를 칼처럼 잘라주는게 아니라 위의 그림처럼 점차 줄여주는 방식이기 때문에 꼬리가 걸린게 아닌가 싶다. 그래서 저항을 좀 키워봤는데도 비슷해서 확 키워서 550오옴 짜릴 넣어줬더니 확실하게 작동한다. 약 8.7Hz이하의 전압변동만 전원으로 들어오기 때문에 수신회로는 노이즈로부터 확실히 격리된 것 같다.



WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,
# active low, active high

http://blog.naver.com/bab102/70035446144
http://www.reconfig-systems.com/8051lecture.htm#active_high

예를 든다면 어떤 칩이 high일때 동작하고 low일때 sleep 모드로 진입한다면 이건 active high이다.



# assert, deassert
http://help.lockergnome.com/linux/meaning-assert-deassert--ftopict280447.html

Given the copious context you've provided, this is just a guess:

assert: set a signal to its "active" state.

deassert: set a signal to its "inactive state.

If a signal is active-low, "asserting" that signal means setting it low and deasserting it means setting it high.

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,
안녕하세요...

현재 PXA-255로 보드를 만들어 디버깅하는 중인데요..

저희 보드 스펙이 UART가 콘솔포함해서 7개거든요..

CPU 내부의 3개외에 여분의 4개 UART가 필요해서

4채널짜리 16C554 UART를 달았습니다..

어드레스는 554의 A0, A1, A2 에 각각 CPU의 A2, A3, A4를 붙였구요...

칩셀렉도 디코딩칩을 이용해서 충분히 넓은 어드레스 공간을 할당하였습니다..

drivers/char/serial.c 를 보니까 include/asm/arch/serial.h 파일안에 아래와 같이

PXA UART를 정의해주는 부분(STD_SERIAL_PORT_DEFNS)이 있고, 확장을 하려면

EXTRA_SERIAL_PORT_DEFNS 정의 부분에서 각각의 구조체 멤버에 값을 적용해주면 되는것 같은데요..

제가 궁금한 점은 아래와 같습니다...


1. serial.c 가 인터럽트 구동방식인가, 폴링방식인가??
~~ 소스가 넘 길어서 부분적으로만 분석했는데 아무래도 타이머가 돌아가는 것을 보니까
폴링방식같은데 실력이 딸려서 파악이 잘 안되네요..또 그와 더불어 인터럽트 방식이라면
구조체의 irq에는 무슨 값을 넣어야 하나요? 아래처럼 IRQ_GPIO_2_80 인가요? 아니면 다른 값인가요??
폴링방식이라면 irq의 값은 의미가 없는 값인가요??

2. PORT_DEFN 부분에서 xmit_fifo_size 에는 무슨 값을 넣습니까??
~~ 알기로는 pxa-255는 피포가 TX, RX 각각 64바이트로 알고 있는데 커널 소스에는 32로 되어 있군요..
16C554의 경우는 각각 16바이트인데...16을 써야 되나요? 아니면 CPU 처럼 반으로 나눈 8을 써야 되나요??

3. io_type 부분에는 무슨 값을 넣나요?
~~ SERIAL_IO_MEM32인가요? 아니면 SERIAL_IO_MEM인가요? 그와 더불어 iomem_base에는 무슨 타입을 써야 됩
니까?
저는 아래와 같이 u32로 하고 있는데 맞는지 확신이 안가네요..

4. serial.c 코드에서 뭔가 수정해야 할 부분이 있습니까??


어느정도 동작은 하는것 같은데...좀 불안해서요...
여기에 나와있는 시리얼 테스트 프로그램은 제대로 돌아가는데,
같은 채널의 TX와 RX를 붙여서 에코 테스트를 하니까 돌아가다가 송수신이 제대로 안됩니다..

쓰다보니 주저리주저리 많아진것 같네요...지루하셨다면 죄송합니다..
위의 사항에 대해 아시는 분이 계시면 알려주세요...
사소한 것이라도 괜찮습니다..

그럼..좋은 주말보내세요...

/////////////////////////////////////////////////////////////////////////////////////
#define TL554A_A (*((volatile u32 *) 0xf3000000)) // TL16C554A Ach virtual addr
#define TL554A_B (*((volatile u32 *) 0xf3100000)) // TL16C554A Bch virtual addr
#define TL554A_C (*((volatile u32 *) 0xf3200000)) // TL16C554A Cch virtual addr
#define TL554A_D (*((volatile u32 *) 0xf3300000)) // TL16C554A Dch virtual addr

#define STD_SERIAL_PORT_DEFNS \
{ \
type: PORT_PXA, \
xmit_fifo_size: 32, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&FFUART,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM32,\
irq: IRQ_FFUART, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_PXA, \
xmit_fifo_size: 32, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&BTUART,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM32,\
irq: IRQ_BTUART, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_PXA, \
xmit_fifo_size: 32, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&STUART,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM32,\
irq: IRQ_STUART, \
flags: STD_COM_FLAGS, \
},

#define EXTRA_SERIAL_PORT_DEFNS \
{ \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_A,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_B,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_C,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}, { \
type: PORT_16550A, \
xmit_fifo_size: 16, \
baud_base: BAUD_BASE, \
iomem_base: (void *)&TL554A_D,\
iomem_reg_shift: 2, \
io_type: SERIAL_IO_MEM,\
irq: IRQ_GPIO_2_80, \
flags: STD_COM_FLAGS, \
}
/////////////////////////////////////////////////////////////////////////////////////

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,

그냥 생각나는 대로, 손 가는 대로 작성해본다.

 

 

사실 통신회로 설계는 Data bus를 사용하지 않고 전용IC를 쓰기만 하면 매우 쉽다.

Datasheet에 있는 application 회로대로만 구성하면 누가 만들어도 대부분은 정상적인 동작을 하게 된다.

다만, 통신포트가 부족할 경우에 어쩔 수 없이 Data bus를 이용하는 85C30이나 68681 (단종된 것들이라 가격도 비싸고, 구하기도 어렵다), 16C550 등을 사용하는 경우는, 하드웨어나 펌웨어 양쪽에서 신경써야 할 것들이 좀 많아진다.

 

일단, RS232 통신은 기본적으로 3가닥의 선을 이용한다. TX line, RX line, GND... 이것만 제대로 연결하면 통신은 무조건 된다. 장담한다 ㅡㅡ

통신선로의 길이는 규격이 나와있지만, 사실 규격보다 더 길게 만들어도 동작한다. 물론, 통신의 정확성은 환경에 따라 달라지므로 장담하지 못한다는 것이 문제이긴 하지만... 실제로 쉴드케이블을 사용하고 RS232 라인을 늘려보았을 때, 50M 정도까지 통신이 되긴 했다. (그 이상은 안해봤다 ㅡㅡ)

뭐, 왠만하면 규격대로 하는 것이 속 편하긴 할 것이다. ㅡㅡ 나도 책임 질 생각은 없다. 누군가 해본다면 안된다고 뭐라고 하지 마라.

 

RS232 통신 전용 IC는 MAXIM 계열 칩들을 제일 많이 사용해봤다. 구하기도 쉽고... MAX3232나 MAX232 등등...

요즘엔 SP232를 더 많이 쓰긴 한다. Sipex 에서 나온 MAX232 호환칩인데, 가격이 더 싸다.

암튼... MAX든 SP든 232의 기본회로는 아래 그림과 같다.

 

 

IC 상단 좌측은 CPU와 연결되는 부분이고, 상단 우측은 외부로 나가는 부분이다. 하단 우측은 clock을 만들어주는 부분이다.

상단 좌우측은 그냥 연결시켜만 주면 끝이고 ㅡㅡ 하단 우측은 대부분 0.1uF 정도의 세라믹 캐패시터를 달아주면 끝이다. 쉽다 ㅡㅡ

Datasheet에 보면 C1~C4 까지 값을 바꿔서 넣어주라고 되어있긴 하지만... 그냥 몽땅 0.1uF으로 연결해도 지장이 없다.

 

뭐, 232를 왜 써야 하느냐에 대한 것들은 다른 블로그나, 자료가 많으니까 빼고...

 

CPU ---- MAX232 ---- 커넥터 =============케이블============== 커넥터 --- MAX232 --- CPU

 

이런 식으로 구성하면 되니까, 구성도 빼고...

 

위 구성대로 연결했는데 통신이 안된다~ 그러면 케이블 결선을 잘못했거나 확인해봐야 한다.

어느 한쪽의 TX line은 다른 쪽의 RX line과 붙어야 한다. (한쪽이 보내면, 다른 쪽은 받는 것이 당연하지 않겠나...)

가끔 GND 라인을 안붙이는 경우도 봤다 ㅡㅡ... GND 중요하다. 반드시 연결하자.

RS232는 3가닥만 있으면 통신은 한다. RTS, CTS 같은 신호선들은 기본적인 통신을 할 때는 전~혀 필요없다.

RX------------------------TX

TX------------------------RX

GND----------------------GND

 

MAX232에 전원을 인가하면, 통신을 하건 안하건 무조건 C3과 C4는 발진을 한다. 이녀석들이 발진을 하지 않으면 통신을 못한다.

이것도 중요하다. 이런 것들을 체크하지 않고 무조건 IC를 갈아보는 경우도 있더라... 돈 아깝다.

 

회로 설계의 기본이라고 해놓고... 써놓은 내용 보니까 아무것도 없다 싶다 ㅡㅡ;;; 제목을 바꿔야겠다 ㅡㅡ

 

COM 포트가 있는 PC에는 기본적으로 232 IC가 들어있다. PC에서 디버깅하려면 232 IC를 반드시 써야 한다.

(내가 처음 H/W 할 때 232 IC를 빼놓고 PC에 연결한 적이 있어서 안다 ㅡㅡ 통신 안한다)

 

 

내용이 별로 없으니... 16C554의 Uart 4 port에 각각 232 를 연결한 회로 하나만 보고 끝내자.

 

 

위에 필요한 신호들만 만들어서 연결해주면 된다. Data bus에서 Uart 포트 뽑아내는데에는 위 구성이 제일 좋다. 구하기 편하고 싸기 때문에 ㅡㅡ;;;



WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,
PXA255에 16c554이용해 UART확장 문의 드립니다..
우선 serial.c와 serial.h를 수정하여 아래와 같이
포트는 설정이 됩니다.. dmesg화면상에 아래와 같으 출력이 나옵니다.

Serial driver version 5.05c (2008-12-11) with no serial options enabled
ttyS00 at 0x0000 (irq = 14) is a PXA UART
ttyS01 at 0x0000 (irq = 13) is a PXA UART
ttyS02 at 0x0000 (irq = 12) is a PXA UART
ttyS03 at 0xf5010000x (irq = 41) is a 16C550
ttyS04 at 0xf5020000x (irq = 42) is a 16C550
ttyS05 at 0xf5030000x (irq = 43) is a 16C550
ttyS06 at 0xf5040000x (irq = 44) is a 16C550

문제는 실제 칩셀렉트가 안되고 있습니다.
가상주소에 대한 정의를 아래와 같이 하였습니다.
{ 0xF5010000, 0x16000000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 }, // CS5 : Serial CS1 A23:L, A24:L, A25:H
{ 0xF5020000, 0x16800000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 }, // CS5 : Serial CS2 A23:H, A24:L, A25:H
{ 0xF5030000, 0x17000000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 }, // CS5 : Serial CS3 A23:L, A24:H, A25:H
{ 0xF5040000, 0x17800000, 0x00010000, DOMAIN_IO, 0, 1, 0, 0 }, // CS5 : Serial CS4 A23:H, A24:H, A25:H

그리고 serial.h에서 확장 UART부분을 아래와 같이 정의하였습니다.

#define EXTRA_BAUD_BASE (3686400/16)
#define EXTRA_STD_COM_FLAGS (ASYNC_SKIP_TEST | ASYNC_LOW_LATENCY)

#define EXTRA_SERIAL_PORT_DEFNS
, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART1,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART1,
flags: EXTRA_STD_COM_FLAGS,
}, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART2,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART2,
flags: EXTRA_STD_COM_FLAGS,
}, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART3,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART3,
flags: EXTRA_STD_COM_FLAGS,
}, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART4,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART4,
flags: EXTRA_STD_COM_FLAGS,
}

#else
#define EXTRA_SERIAL_PORT_DEFNS
#endif


그런데.. 오실로 스코프를 찍어보면
실제CPU의 cs5가 활성화가 안되고 있습니다.
몇리째 삽질중인데..

조언부탁드립니다..
많이 어렵네요..ㅠㅠ

=================================================================================================================
이미 체크해보셨을 수도 있겠지만 혹시나해서...
cs5 의 어드레스 영역에 정상적으로 접근이 되는지 보셨나요?
아직 안해보셨다면 cs5 의 어드레스 영역에 읽고 쓰기가 정상적으로 되는지 mmap 같은 걸 이용한 간단한 프로그램을 돌리신 후에 오실로스코프로 확인해 보셔도 될 것 같은데요...
=================================================================================================================답변감사합니다..
CS5가 살지 않아
임의의 디바이스드라이버를 많들어 같은 가상주소와 같은 물리주소를주고
칩셀렉트가 되는지를 확인해봤습니다...


시그널 아주 잘 뜹니다.. 그래서 더 미치겠슴다..ㅠㅠ

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,
안녕하세요
16c554 UART 칩 포팅관련하여 질문을 드립니다.
먼저 프로세서는 MPC8313 이며(POWER PC)
Linux 2.6.20 을 씁니다.

기존에 프로세서에서 지원하는 2개의 UART 를 썼는데,
UART 가 추가 로 필요하게 되어 16C554 칩을 쓰게 되었습니다.
16550 4개를 CS 4개를 통하여 제어한다고 생각하면 편합니다.
회로 연결은 Local BUS 에 칩의 Address ,Data,Irq 를 연결하였습니다.
그리고 Local BUS 의 OE,WE 을 칩의 Read,Write Enable 에 연결하였습니다.
그런데 기존 버전 2.4때에서는 Serial.h 에서
#define EXTRA_SERIAL_PORT_DEFNS
, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART1,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART1,
flags: EXTRA_STD_COM_FLAGS,
}, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART2,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART2,
flags: EXTRA_STD_COM_FLAGS,
}, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART3,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART3,
flags: EXTRA_STD_COM_FLAGS,
}, {
type: PORT_16C550,
xmit_fifo_size: 16,
baud_base: EXTRA_BAUD_BASE,
iomem_base: (void *)&EXT_UART4,
iomem_reg_shift: 1,
io_type: SERIAL_IO_MEM,
irq: IRQ_UART4,
flags: EXTRA_STD_COM_FLAGS,
}

#else
#define EXTRA_SERIAL_PORT_DEFNS
#endif

위와 같이 포트를 추가하여주었는데 2.6 에서는 어디에 추가 를 해야될지모르겠습니다.
추가 하는 곳만 알면 거기에 추가 해볼텐데 drivers/serial/8250.c 에 추가 해야하는건가여?
2.6 에 외부 Serial Port 를 어디에서 구조체를 선언해야되는지 아시는 분 도움좀 주세요~~
며칠째 씨름 하고 있는데~~너무 않되네여~~~꼭도와주세여~~~`!!


==============================================================================================================

Freescale 계열은 /arch/powerpc/boot/mpc8313erdb.dtd
파일을 수정해야할거같은데 너무 막막하네여
이 DTD 파일이 Kernel 보다 먼저 실행되는거같습니다.


WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,

가끔 질문이 올라 온 내용 중 하나인, rs-232c 포트를 atmega128에서 지원하는 2개 이상 사용하기에 대한 답을 한번 정리 해 봤습니다.

 

RS-232 통신 포트의 수를 늘리고 싶다면?
1. MCU 를 바꾼다.
2. Software 적인 Serial 통신을 구현한다.
3. TL16C554 같은 Full duplex, buffer 를 지원하는 전용의 IC를 사용한다.
4. I2C/SPI  RS-232c 를 구현하던가, 아니면 IC를 구해 본다.
5. MAX399 같은 MUX를 사용한다.

 

1. atmega 128의 상위 모델 중 atmega640, atmega1280, atmeg2560등은 4개의 serial uart(rs-232c)를 가지고 있다.

    단 MCU가 100핀 짜리라는 단점이 있다.  현재 실컷 128 등으로 작업을 한 상태라면 처음부터 다시 시작해야 한다는 슬픔이 있다.

 

2. GPIO를 이용하여 소프트웨어 적으로 rs-232 통신을 구현할 수 있다.

관련된 자료로는 Procyon Library에 포함되어 있는 uartsw.c 또는 uartsw2.c  를 참고 하기 바란다.  또한 이 방식은 comfile社에서 판매하고 있는 PIC basic 제품군에서도 사용하고 있는 방법이다. 하지만 이것 또한 인터럽트 방식으로 사용할 수 없으며, 한 개의 byte를 받는 과정에서도 데이터를 정확히 받을 수 있다는 보장이 없다. 예전에 Serial Pic’n 이라는 PIC mcu의 책에서도 이 방법에 대한 설명과 어셈블리 소스가 있었다. 책을 팔고나니 볼 일이 생기는 것 같다.


 

3. TL16C554는 4개까지 시리얼 포트를 확장할 수 있으며, 내장 FIFO(16byte)와 함께 Flow Control 까지 가능하다.

이 IC를 사용하는 것이 가장 정석적인 방법이지만, 사용방법이 쉽지는 않다. 예전에 도스 시절에 직접 RS-232c 포트 프로그램을 작성 하던 때가 생각이 날 정도다. 또한 address mapping방식으로 이 IC를 연결해야 한다. 그래서 외부 주변장치들과 mcu와의 연결을 GPIO를 이용하여 연결했다면, 설계를 다 바꿔야 할 지도 모른다.  이런 용도의 IC들은 uart의 개수, FIFO의 크기 등에 따라서 다양한 모델이 있으므로, www.ti.com  에서 “TI Home > Interface > UARTs “ 에서 찾아 보기 바란다.

또한, EXAR(www.exar.com)에서도 이런 기능의 IC를 판매하고 있다. 전자기술 2004년 8월호에 이 EXAR 의 ST16C2550을 사용하여 설계하고 프로그래밍을 하는 기법에 대한 기사가 있다.

 

4. I2C/SPI <=> RS-232 ic 를 사용한다.
이 방식은 예전에 본인도 한번 구상을 했었다. AVR, PIC을 이용해서 프로그램을 잘 짜면 되지 않을까? 라고 생각을 했는데,

하지만 AVR을 사용할 경우 한가지의 문제가 있는데 하드웨어에 구현한 FIFO 가 없어서 full duplex가 가능할 것 같지 않다는 것이다. EXAR社의  XR20M1170 라는 제품은 하드웨어에 rs-232용의  64byte 양방향 FIFO가 있는데,

1) 부품을 구할 수 있을 지 ? 2) 동작 전압이 1.62~3.3V 라서 5V용의 MCU와의 연결을 위해서는 각 신호 선들의 level을 바꿔주어야 하는 단점이 있다.

 

5. Mux 를 사용
예) MAX399 :: http://www.fh-augsburg.de/~hhoegl/proj/rs232-mux/300.html 
 


이 방법은 현재 선택되어 있지 않은 포트에서 데이터가 들어 올 경우, 데이터를 잃어 버릴 수 있다.  하지만, rs-232로 데이터를 내보내기만 할 경우에는 유용하게 사용할 수 있다.

WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,