STM32 Cortex M3 MCU에 연결된 플래시 메모리 칩용 드라이버를 만들어야한다. 이 칩은 SPI 버스를 통해 제어된다. 필자는 MCU의 통합 SPI 주변 장치를 사용하려고했지만 안타깝게도 8 비트 또는 16 비트 데이터 패킷 만 지원하고 플래시 칩 명령은 14 비트 길이입니다. 따라서 GPIO를 사용하여 처음부터 프로토콜을 구현해야합니다. 내 질문은 : 올바른 신호 타이밍을 보장하는 올바른 방법은 무엇입니까? 나는 현재 인터럽트가 비활성화 된 상태에서 GPIO 라인을 표기하는 것과 해제하는 것 사이에 delays을 삽입하는 것을 고려하고있다. 그러나 이것은 나에게 상당히 신뢰할 수없는 것처럼 보인다. 더 좋은 방법이 있습니까?ARM Cortex M3에서 비표준 SPI 변형 구현
답변
Jeb의 답변이 선호되는 방법이며 가능한 경우 하드웨어 SPI를 사용하고 DMA가 좋은 옵션인지 확인해야합니다.
하드웨어 SPI를 사용할 수 없지만 GPIO를 통해 "비트 뱅잉"을 사용해야 만하는 경우에는 타이머/PWM 하드웨어에서 사용할 수있는 옵션을 확인해야합니다 MCU. 은이 될 수 없으며 게시 한 링크에서와 같이 무딘 "애호가 화상 끊김 지연"을 사용하면 안됩니다. 실시간 성능은 허튼 소리이며 CPU 100 %를 차지합니다.
대부분의 MCU 타이머에는 핀 출력 기능이있어 타이머가 경과 할 때 핀이 상태를 바꿀 수 있습니다. 의사 코드는 다음과 같다 : 보내 다음 비트가 1 또는
- 는 결정이 높거나 낮은 레벨로 핀 전환되도록 상기 MCU 극성 레지스터 따라서 설정한다.
- 타이머가 경과하면 인터럽트를 통해 다시 한 번 극성을 설정해야합니다. 이렇게하는 방법은 하드웨어에 매우 의존적입니다.
- 데이터 (MOSI)를 비트 뱅크하는 동시에 클럭 및 칩 선택을 생성해야합니다. 클럭은 데이터와 동일한 방식으로 생성 될 수 있으며, 가능하다면 PWM 신호를 통해 생성 될 수 있습니다. 칩 선택은 데이터 전송 중에 핀을 낮추기 만하면되는 가장 쉬운 부분입니다.
마지막으로 특정 MCU에 소프트웨어 SPI를 쓰는 방법에 대한 응용 프로그램 노트 나 공식 예제가있을 가능성이 큽니다.
가능하면 SPI 및 DMA로 빌드를 사용하는 것이 좋습니다!
데이터를 14 비트의 배수 크기의 바이트 배열로 다시 매핑 할 수 있습니다. 그래서 매번 7 * 4Bits = 28bytes의 배수를 보내야합니다.
그런 다음 8Bit 크기의 표준 SPI를 사용할 수 있습니다.
하지만 GPIO의 비트보다 SPI/DMA가 훨씬 빠릅니다.
모호한 데이터 길이를 사용하는 일부 장치는 트랜잭션 시작시 첫 번째 "1"전에 클록 된 모든 "0"비트 또는 클록 된 모든 "1"비트를 무시하거나 처음 "0"전에. 장치가 이러한 방식으로 설계된 경우 관심있는 비트와 함께 2 개의 "정크"비트를 클럭킹하여 8 비트 또는 16 비트 SPI 모드를 사용할 수 있습니다.
- 1. ARM Cortex-M3에서 newlib의 malloc 사용
- 2. 인터럽트 보류 중 ARM Cortex-M3 예
- 3. 툴체인 ARM Cortex M4
- 4. 통합 ARM Cortex M3 설명서
- 5. ARM Cortex M3에서 저전력 정지 모드로 LSI 발진기를 비활성화 할 수 있습니까?
- 6. Sourcery CodeBench ARM Cortex-M 벡터 테이블 구현
- 7. ARM-Cortex Ubuntu 배포판에서 i386 라이브러리 컴파일
- 8. 스레딩 : ARM Cortex A8에서 USB 키보드 실행
- 9. ARM Cortex-R4에서 MMU가없는 Linux 실행
- 10. ARM Cortex M3/4 용 압축 라이브러리
- 11. Cortex M3 - 세마포어 사용 방법
- 12. PIC32에 SPI 슬레이브 ISR을 구현 하시겠습니까?
- 13. ARM Cortex M3 기반 MCU의 예제 코드는 무엇입니까?
- 14. ARM Cortex-A8 : NEON과 vfpv3을 모두 사용하는 방법
- 15. 하드웨어 카운터를 사용하여 ARM Cortex-A8 실행 시간 측정
- 16. ARM Cortex-A8 파이프 라인은 13 단계 또는 14 단계입니까?
- 17. ARM Cortex A9의 다른 코어를 재설정하는 방법은 무엇입니까?
- 18. ARM (Cortex M3)의 인앱 (in-application) 프로그래밍은 어떻게 작동합니까?
- 19. OpenGL : 변형 행렬 스택 구현
- 20. ARM 아키텍처 및 패밀리
- 21. Cortex-M3 초기화
- 22. Cortex M3 용 Java VM
- 23. arm-eabi-gcc와 arm-elf-gcc의 차이점은 무엇입니까?
- 24. Bulls & Cows C# 구현 (기안자 변형)
- 25. ARM-NEON은 어떻게 동기화합니까?
- 26. Cortex-M3 용 Libffi를 만들 수 있습니까?
- 27. SDHC SPI 쓰기 문제
- 28. MSP430 SPI to M25P64
- 29. Linux SPI 드라이버 문제집
- 30. SPI 헤더 파일
나는 이처럼 모호한 인터페이스로 메모리를 거부합니다. "표준 SPI"를 사용하여 사용할 수있는 추억이 많습니다. SPI 표준이 있습니다. – Lundin
@ Lundin, 불행히도, 하드웨어 부분은 나에 의해 설계되지 않았으며 분명히 지금은 버릴 수 없습니다. 나는 더 편리한 인터페이스를 가진 칩이 더 나은 선택이었을 것이라는 데 동의한다. –
아마도 다른 제조업체의 핀 호환 옵션이 있습니까? 하드웨어를 재 설계하는 것이 선택 사항이 아니더라도 적어도 특정 부분이 왜 사용되었는지에 대한 이유를 묻는 것이 좋습니다. – Lundin