2014-09-02 2 views
-1

동기 모드에서 USART를 사용하여 호스트 컴퓨터에서 펌웨어 (ATMega 1284P에 있음)와 통신합니다. 펌웨어 측면에서 최대 버퍼 크기는 20입니다. 호스트에서 펌웨어로 데이터를 계속 보내고 펌웨어에서 호스트 컴퓨터로 일부 응답을 보내면 어떻게 든 통신이 잠 깁니다. 나는 TXB (Transmit Data Buffer)와 RXB (Receive Data Buffer) 모두에 공통 인 UDR 레지스터가 잠겨져있어 통신이 중단되는 결과를 초래할 수 있습니다. 이 문제에 대한 제안 사항은 무엇입니까?AVR ATMega1284P USART 통신 잠금 장치

PS : 호스트 펌웨어에서 transmisson 들어 에서, codition은 : UCSRA & (1 < < UDRE)

펌웨어 호스트로부터 수신율

, 조건이 TRUE 같아야 UCSRA & (1 < < RXC)은 TRUE 여야합니다.

호스트에서 일련 문자의 가용성을 확인하기 위해 하드웨어 인터럽트 M_USARTx_RX_vect를 사용하고 있습니다.

업데이트 :Firmware - Initial Source : MarlinSerial.cpp : USART 정의, Marlin_main.cpp : 프로그램 흐름

+3

임베디드 프로그래밍, atmega 디바이스에서 UART를 사용하는 방법입니다. 관련된 네트워크가 없습니다! – Klaus

+0

"동기식"모드를 정말로 의미합니까? 이것은 항상 별도의 클럭 라인을 사용합니다. rs232를 통해 PC에 통신하는 경우 비동기 모드를 사용해야합니다! 어쩌면 여기서 문제가 시작됩니다 ... – Klaus

+0

아니요 rs232를 사용하지 않고 호스트 (아치 리눅스 실행)와 컨트롤러가 서로 다른 두 개의 보드에 함께 바인딩됩니다. 그래서 케이블이 필요 없습니다. – Nagarjun

답변

0

UDR 레지스터는 물리적으로 (특수 입출력 레지스터 매핑) AVR의 주소 공간에서 동일한 주소에서 두 번 존재 . 하드웨어에는 uxrt의 rud와 tx 사이에 잠금이 없습니다.

표시된 조건은 나에게 잘 보이지만 avr 데이터 시트를 살펴 보지 않았습니다.

주기적으로 쓰기/읽기를하는 동안 몇 가지 문제가있을 수 있습니까? 20 자 버퍼? 코드를 보여주십시오 (이해가 필요한 최소한으로 축소하십시오).

+0

호스트에서 펌웨어로 전송되는 데이터를 20 개 미만으로 제한하면 완벽하게 작동합니다. 그런 다음 펌웨어 측면에서 호스트로의 승인을 기반으로 추가 데이터를 보냅니다. 버퍼는 char 유형입니다. 호스트에서 데이터를 지속적으로 전송하는 경우에만 문제가 나타납니다. 한도가 20을 초과하면 펌웨어가 응답을 중지합니다 (펌웨어는 확인을 보낼 수 없으며 호스트는 다음 데이터를 보내기 위해 승인을 기다리고 있음). – Nagarjun

+2

코드를 보여 주시면 문제를 찾을 수 있습니다. 저는 블랙 박스를 분석하는 원격 전문가가 아닙니다 :-) – Klaus