V-USB는 어떻게 ATmega328p의 내장 SPI를 망칠 수 있습니까?


14

ATmega328p를 사용하여 키보드로 표시되는 V-USB 프로젝트를 작업 중입니다. USB 부분은 훌륭하게 작동하지만 (첫 번째 V-USB 프로젝트는 아님) V로 USB 스택을 시작 usbInit()하면 SD 카드 라이브러리에 대한 모든 호출이 실패합니다. 전에 동일한 함수를 호출하면 usbInit()모든 것이 완벽하게 작동합니다.

Diavolino라는 Arduino 클론을 사용하지만 Arduino / 배선 프레임 워크는 없습니다. USB를 디지털 I / O 2 및 3에 연결하고 SD 카드를 10-13 (내장 SPI 라인)에 연결했습니다.

SD 카드 라이브러리를 살펴본 후 이외의 인터럽트 나 레지스터를 사용하여 아무런 징후도 발견하지 못했습니다 SPxx. 나는 또한 grepV-USB 코드를 사용하고 싶지만SPxx 레지스터를 .

문제의 첫 징후는 SD 카드에 액세스하려고 할 때 장치의 연결이 끊어졌을 때였습니다. 그럼 난 넣어 usbPoll()wdt_reset() 루프를 처리하는 모든 SD 카드에 전화하고, 발견 쓰기의 경우, 마지막 2 바이트를 전송 한 후 영원히 카드의 승인을위한 카드 대기 (CRC-16).

내가 사용하는 SD 카드 라이브러리는 sd_rawRoland Riegel입니다.


2
V-USB는 CPU를 매우 많이 사용한다는 점을 이해하고 있으며 SPI 루틴에 허용되지 않는 지연이 발생할 수 있습니다. 일반적으로 SPI 작업은 타이밍에 민감하지 않지만 SPI FLASH의 쓰기 및 지우기 작업은 분명합니다.
Dave Tweed

문제는 읽기 작업조차도 대부분 작동하지 않았으며, 읽은 것처럼 SPI 통신은 데이터 및 제어 레지스터가 실행 코드에 의해 설정되는 즉시 독립적으로 수행됩니다.
dnet

@DaveTweed-카드를 기다릴 필요가 있다는 점에서 시간에 민감하지만, 카드가 프로그램을 기다리게 할 수 없다는 점에서 ??
Chris Stratton

2
아마도 당신은 일어날 수 없거나 감지 할 수없는 것을 기다리고있을 것입니다. 예를 들어, I / O 핀이 재구성되어 더 이상 입력이되지 않았거나, 스퓨리어스 데이터 / 클럭이 카드로 전송되어 원하지 않는 상태가 될 수 있습니다. 또한 SD 라이브러리가 필요한 지연을 수행하는 메커니즘이 손상되거나 가속화되지 않았는지 확인하십시오.
Chris Stratton

3
소음이나 전원 공급 장치 문제가있을 수도 있습니다. 스코프를 사용하여 레일을 확인하고 로직 분석기로 SD 라인을 확인하여 진행 상황을 확인하십시오.
Jim Paris

답변:


1

USART와 같은 문제가 있었고 워치 독 설정을 변경하여 문제를 해결했습니다. 아시다시피 V-USB는 워치 독을 사용하며 한 번의 작업으로 추가 시간을두면 워치 독이 활성화됩니다. 워치 독을 비활성화하고 모든 것이 제대로 작동하는 경우 워치 독 시간을 변경하거나 간섭 코드 (귀하의 경우 SD 카드 코드)를 작은 부분으로 분할하여 워치 독을 "재설정"할 수 있습니다. 그러나 디버깅 후에 워치 독을 다시 활성화하는 것을 잊지 마십시오. V-USB를 사용하지 않는 것이 좋습니다.


이 질문에는 SD 코드에 wdt_reset () 호출이 삽입되어 있다고 언급되어 있습니다. 물론 이것은 모든 곳에서 수행되지 않았을 수도 있습니다.
Chris Stratton

1
예. 워치 독을 비활성화하여 코드를 사용해 볼 가치가 있습니다. 때때로 리턴 데이터가 인터럽트 루틴에서 처리 될 때, 코드가 거기서
Aug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.