SPI가 중단되는 것이 안전합니까?


17

펌웨어 내에서 microSD 카드에 쓰는 중이지만 우선 순위가 가장 낮은 작업이므로 읽기 / 쓰기 도중에 다른 작업으로 인해 중단 될 수 있습니다.

이제 UART를 사용하여이 microSD 카드와 통신했다고 가정합니다. 읽기 중 문제는 하드웨어 RX FIFO 가 오버플로되므로 노력할 수있는 최대 지연은 (FIFO 크기 × 바이트 / 초)이며 쓰기 중에 다른 쪽 끝은 내가 기다릴 때까지 기다리기 때문에 아무런 문제가 없습니다 다음 문자를 보내십시오.

SPI를 사용하는 지금 어떻게 작동합니까? 상황이 쓰기에 중요하지 않은 것과 동일하고 읽기에 대해서는 SPI FIFO 크기에 따라 달라 집니까?

답변:


22

대부분의 SPI 장치는 지정된 최대 값 이하의 모든 데이터 속도에서 완벽하게 만족합니다. 트랜잭션의 일부를 수행하고 어느 시점에서든 휴식을 취하고 몇 년 후에 다시 돌아와서 완료 할 수 있습니다. 클록, 셀렉트 또는 전력선에 결함이없는 경우 거래는 정상적으로 완료됩니다.

알아야 할 세 가지 주요 경고가 있습니다.

  1. 일반적으로 SPI 버스에서 트랜잭션이 시작되면 해당 트랜잭션이 완료 될 때까지 버스의 어떤 와이어도 다른 용도로 사용될 수 없습니다. 일반적으로 이는 버스를 사용할 유일한 경우가 아닌 한 인터럽트가 SPI 버스를 사용하지 않을 수 있음을 의미합니다 (인터럽트가 버스를 독점적으로 사용하는 경우가있을 수 있음). 다른 시간에 독점적으로 사용하는 프로그램). 일부 장치에는 트랜잭션 중간에 버스를 "무시"할 수있는 특수 핀이 포함되어 있지만 이러한 기능을 사용하더라도 한 장치와 SPI 트랜잭션을 일시 중단하고 다른 장치와 트랜잭션을 수행하는 것을 권장하지 않습니다. 그런 다음 기본 코드가 첫 번째 코드와의 트랜잭션을 재개하도록합니다. 인터럽트가 별도의 SPI 버스를 사용하도록하는 것이 좋습니다.
  2. 트랜잭션이 너무 오래 지속되면 일부 장치가 이상하게 작동 할 수 있습니다. 예를 들어, 일부 실시간 클록 칩은 시간 / 날짜 레지스터를 이중 버퍼링하지 않고 트랜잭션 중에 발생하는 "시간 진행"이벤트를 래치하고 트랜잭션이 완료된 후에 적용합니다. 트랜잭션이 너무 오래 걸리면 두 번째 시간 진행 이벤트가 도착하면 후자의 이벤트가 무시되어 시계가 해당 시간만큼 미끄러집니다. 데이터를 이중 버퍼링하는 비용을 원치 않더라도 소프트웨어가 "업데이트 지연"로직을 추가하는 것보다 일관성을 보장 할 책임이 있음을 명시하면서 데이터를 이중 버퍼링하는 비용을 원하지 않더라도 (클럭 교란 가능성을 최소화 할 것입니다)) 그러나 그러한 칩이 존재합니다.
  3. 클럭과 데이터 신호를 사용하지만 프레임을 나타내는 "일시 정지"를 사용하는 몇 가지 장치가 있습니다. 내가 본 가장 최근의 예는 컨트롤러 당 전구 LED 라이트 스트링입니다. 나는 그런 디자인이 특히 마음에 들지 않으며 (중간 시계없이 데이터 와이어에서 3 개의 연속 상승 에지를 사용하여 프레임을 나타낼 수도 있음) 다시는 그런 장치가 존재합니다.

특정 유형의 통신에는 특정 타이밍을 사용해야하지만 SPI 장치가이를 요구하는 이유는 거의 없습니다. 그럼에도 불구하고, 그러한 장치의 존재를 염두에 두어야합니다.


3
+1 니스! 귀하의 모든 의견 / 좌절에 완전히 동의하십시오. 너무 여러 번 보았습니다.
DrFriedParts 2013

11

사양의 사본을 확인하면 (저작권 / NDA 이유로 인용 할 수 없음) SPI 속도는 0Hz에서 시작하여 정적 작동이 양호 함을 나타냅니다. SPI에서는 장치가 클럭킹되는 동안에 만 데이터를 가져 오므로 하드웨어 SPI를 사용하는 경우 데이터가 전송 된 후 (0 / 상관하지 않더라도) 무언가 만 수신됩니다. 따라서 UART와는 달리 원치 않는 데이터를 언제든지 다시받을 수 있습니다.


그래서 MicroSD 카드에는 일종의 타임 아웃이 내장되어 있지만 SPI 자체는 아니라고 걱정해야합니다.
Muis

5
내가 볼 수있는 모든 사양에 따르면 SD 카드에 어떤 시간 제한이 없어야한다는 것을 알았으므로 실제로 문제가 있음을 보지 마십시오. 몇 년 전 나는 약간의 커스텀 코드를 작성했고 디버깅하는 동안 SPI 작업 사이에 10 초 이상 남은 코드를 단계별로 디버깅하는 것이 좋았습니다.
PeterJ

1
+1, SPI를 0Hz까지 낮추는 것이 디버깅에 유용합니다. 감사.
Anindo Ghosh

1
일부 SPI 디바이스에서 데이터 출력은 특정 클럭 에지에서만 변경 될 수 있지만 다른 일부에서는 데이터 출력이 비동기 적으로 변경 될 수 있습니다. 이것은 특히 "사용 중"비트에서 일반적입니다. 일부 칩에서 "사용 중"비트의 상태를 클럭 아웃하고 부품이 사용 중이 아닐 때 여전히 출력에 있으면 출력이 비동기 적으로 변경됩니다. 다른 칩에서는보고 된 "사용 중"상태가 다시 클럭 될 때까지 변경되지 않습니다. 두 설계 모두 장단점이 있으므로 두 가지 유형의 설계가 모두 존재한다는 것을 아는 것이 유용합니다.
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.