참을성이없는 사람은 배경을 건너 뛸 수 있습니다.
배경
SPI와 통신하는 일련의 마이크로 컨트롤러를 프로그래밍하고 있습니다. n버스를 공유하는 하나의 마스터와 슬레이브가 있습니다. 칩 선택이 없습니다. (나쁜 디자인은 아니지만 n크기가 커서 n추가 라인을 위한 공간이 충분하지 않습니다 ).
그러므로 그들의 MISO를 높은 임피던스로 유지하고 그들 중 대부분이 말을하는 것은 노예의 책임입니다. 이는 ID가 폴링 될 때만 응답하여 수행됩니다.
이제 마스터가 연결된 ID로 슬레이브를 발견하는 초기 발견 단계를 원합니다. 인생을 더 쉽게 (일부 측면에서) 만들기 위해 id를 고유하게 (예를 들어 32 비트) 갖고 싶습니다. 이를 통해 마스터는 ID를 하나씩 간단히 폴링하고 누가 응답하는지 확인할 수 없습니다 (너무 많은 가능성이 있음).
이 문제를 해결하기 위해 슬레이브가 일괄 적으로 응답하고 마스터가 최소 ID를 빠르게 찾을 수있는 이진 검색 변형을 고안했습니다. 해당 ID를 가진 슬레이브에게 더 이상 참여하지 말라고 알려주고 알고리즘이 반복됩니다. (중요하지 않은 세부 사항).
그래도 한 가지 문제가 있습니다. 집합적인 응답은 모든 응답의 논리적 OR (또는 논리적 AND)이어야합니다. MISO 버스가 논리 OR 역할을 할 수있는 방식으로 회선을 구성 할 수 있다고 들었습니다. 내가 들었던 것은 :
- 마스터의 MISO를 풀업으로 설정하고
- 모든 슬레이브의 MISO를 오픈 드레인으로 설정하십시오.
이것을 시도했지만 단일 슬레이브 조차도이 구성이 작동하지 않습니다 (오실로스코프는 라인에 일정한 영점을 표시합니다). 마스터에서 MISO를 고 임피던스 입력으로 구성하면 오실로스코프에서 두 슬레이브의 출력 비트가 다른 경우 전압이 절반으로 떨어진다는 것을 알 수 있습니다 (기본적으로 단락 I 추정).
참고 : 마스터에서 MISO를 높은 임피던스로 구성하고 슬레이브를 각각 푸시 풀로 구성하면 동일한 버스에 많은 MISO가 있더라도 개별적으로 대화 할 수 있습니다. 나는 그것이 회선 자체의 문제인지 의심합니다.
질문
내 질문은 이것이 가능하다면 그렇다면 공유 MISO 라인이 논리 OR (또는 논리 AND)로 작동하도록 마스터와 슬레이브의 입력 및 출력 핀을 어떻게 구성 할 수 있습니까?
편집하다
그것이 음의 논리 (기본적으로 AND)를 가진 OR이되었습니다.
단일 슬레이브의 문제는 마스터의 풀업 핀에 1을 쓰는 것으로 해결되었습니다. 이전에는 초기 상태가 0이었습니다.
편집 2
ST 슬레이브가 MIO의 GPIO 구성을 오픈 드레인으로 덮어 쓰고 작성시이를 강제로 높이는 것으로 나타났습니다. 이 특별한 경우 SPI를 침묵시키고 MISO를 수동으로 출력하기로 결정했습니다.