2012-10-23 3 views
3

STM32 Cortex M3 MCU에 연결된 플래시 메모리 칩용 드라이버를 만들어야한다. 이 칩은 SPI 버스를 통해 제어된다. 필자는 MCU의 통합 SPI 주변 장치를 사용하려고했지만 안타깝게도 8 비트 또는 16 비트 데이터 패킷 만 지원하고 플래시 칩 명령은 14 비트 길이입니다. 따라서 GPIO를 사용하여 처음부터 프로토콜을 구현해야합니다. 내 질문은 : 올바른 신호 타이밍을 보장하는 올바른 방법은 무엇입니까? 나는 현재 인터럽트가 비활성화 된 상태에서 GPIO 라인을 표기하는 것과 해제하는 것 사이에 delays을 삽입하는 것을 고려하고있다. 그러나 이것은 나에게 상당히 신뢰할 수없는 것처럼 보인다. 더 좋은 방법이 있습니까?ARM Cortex M3에서 비표준 SPI 변형 구현

+4

나는 이처럼 모호한 인터페이스로 메모리를 거부합니다. "표준 SPI"를 사용하여 사용할 수있는 추억이 많습니다. SPI 표준이 있습니다. – Lundin

+0

@ Lundin, 불행히도, 하드웨어 부분은 나에 의해 설계되지 않았으며 분명히 지금은 버릴 수 없습니다. 나는 더 편리한 인터페이스를 가진 칩이 더 나은 선택이었을 것이라는 데 동의한다. –

+1

아마도 다른 제조업체의 핀 호환 옵션이 있습니까? 하드웨어를 재 설계하는 것이 선택 사항이 아니더라도 적어도 특정 부분이 왜 사용되었는지에 대한 이유를 묻는 것이 좋습니다. – Lundin

답변

4

Jeb의 답변이 선호되는 방법이며 가능한 경우 하드웨어 SPI를 사용하고 DMA가 좋은 옵션인지 확인해야합니다.

하드웨어 SPI를 사용할 수 없지만 GPIO를 통해 "비트 뱅잉"을 사용해야 만하는 경우에는 타이머/PWM 하드웨어에서 사용할 수있는 옵션을 확인해야합니다 MCU. 이 될 수 없으며 게시 한 링크에서와 같이 무딘 "애호가 화상 끊김 지연"을 사용하면 안됩니다. 실시간 성능은 허튼 소리이며 CPU 100 %를 차지합니다.

대부분의 MCU 타이머에는 핀 출력 기능이있어 타이머가 경과 할 때 핀이 상태를 바꿀 수 있습니다. 의사 코드는 다음과 같다 : 보내 다음 비트가 1 또는

  • 0이면
    • 는 결정이 높거나 낮은 레벨로 핀 전환되도록 상기 MCU 극성 레지스터 따라서 설정한다.
    • 타이머가 경과하면 인터럽트를 통해 다시 한 번 극성을 설정해야합니다. 이렇게하는 방법은 하드웨어에 매우 의존적입니다.
    • 데이터 (MOSI)를 비트 뱅크하는 동시에 클럭 및 칩 선택을 생성해야합니다. 클럭은 데이터와 동일한 방식으로 생성 될 수 있으며, 가능하다면 PWM 신호를 통해 생성 될 수 있습니다. 칩 선택은 데이터 전송 중에 핀을 낮추기 만하면되는 가장 쉬운 부분입니다.

    마지막으로 특정 MCU에 소프트웨어 SPI를 쓰는 방법에 대한 응용 프로그램 노트 나 공식 예제가있을 가능성이 큽니다.

  • 2

    가능하면 SPI 및 DMA로 빌드를 사용하는 것이 좋습니다!

    데이터를 14 비트의 배수 크기의 바이트 배열로 다시 매핑 할 수 있습니다. 그래서 매번 7 * 4Bits = 28bytes의 배수를 보내야합니다.
    그런 다음 8Bit 크기의 표준 SPI를 사용할 수 있습니다.

    하지만 GPIO의 비트보다 SPI/DMA가 훨씬 빠릅니다.

    0

    모호한 데이터 길이를 사용하는 일부 장치는 트랜잭션 시작시 첫 번째 "1"전에 클록 된 모든 "0"비트 또는 클록 된 모든 "1"비트를 무시하거나 처음 "0"전에. 장치가 이러한 방식으로 설계된 경우 관심있는 비트와 함께 2 개의 "정크"비트를 클럭킹하여 8 비트 또는 16 비트 SPI 모드를 사용할 수 있습니다.

    관련 문제