공유 버스를 OR로 사용


10

참을성이없는 사람은 배경을 건너 뛸 수 있습니다.

배경

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)로 작동하도록 마스터와 슬레이브의 입력 및 출력 핀을 어떻게 구성 할 수 있습니까?


편집하다

  1. 그것이 음의 논리 (기본적으로 AND)를 가진 OR이되었습니다.

  2. 단일 슬레이브의 문제는 마스터의 풀업 핀에 1을 쓰는 것으로 해결되었습니다. 이전에는 초기 상태가 0이었습니다.

편집 2

ST 슬레이브가 MIO의 GPIO 구성을 오픈 드레인으로 덮어 쓰고 작성시이를 강제로 높이는 것으로 나타났습니다. 이 특별한 경우 SPI를 침묵시키고 MISO를 수동으로 출력하기로 결정했습니다.


나는 당신이 그것을 생각했기 때문에 물어보고 싶지 않지만 I2C 또는 CAN 사용을 고려 했습니까? 이 장치는 n 개의 장치 용으로 설계되었지만 SPI는 각 장치의 칩 선택과 함께 사용되도록 설계되었습니다.
Bob

@ 밥, 네 그들은 너무 느립니다. 어쨌든 내 질문에 대한 대답이 "불가능합니다"라면 약간의 수동 작업을 수행해야하지만 SPI를 사용하면 최종 제품이 훨씬 좋습니다.
Shahbaz

1
24 비트 (16,772,216 변형)를 사용하는 경우 "발견"명령을 보내고 16,772,216 클럭을 기다릴 수 있고 모든 슬레이브 정보를 가질 수 있기 때문에 32 비트를 주소로 사용하는 것이 유감입니다. 10Mbps에서 2 초 미만의 시간이 걸리고 충돌이 발생하지 않습니다. 이봐, 당신은 내가 그렇게 생각 +1했습니다.
Andy 일명

@Andyaka, 24 비트도 나쁘지 않을 수도 있습니다 (그러나 32 비트가 확실히 좋습니다). 내가 당신을 올바르게 이해했다면, 각 슬레이브가 1 번째 시계로 1 번째 시계에 응답하고 마스터가 어느 시계가 1을 생성했는지 봅니다. 슬레이브가 바이트 단위로 응답하는 것을 제외하고는 나쁘지 않습니다. 따라서 각 슬레이브는 8 비트로 응답하고 버스를 OR로 작동시킬 수 없다면 한 슬레이브의 응답은 다른 슬레이브의 응답 내에서 "손실"됩니다 (한 슬레이브의 1은 모두 0에서 풀다운됩니다) 나머지).
Shahbaz

@Shahbaz 만약 슬레이브 코드를 제어 할 수 있다면, 슬레이브가 할당 된 시간에 1 비트로 만 응답하는 "특별한"것으로 만들 수 있습니다. 예, 당신은 내 생각의 요지를 얻었습니다.
Andy 일명

답변:


5

선택하지 않은 SPI는 Microchip이 MCP23017 칩 (및 기타)에서 사용하는 것입니다. 그 접근법에는 아무런 문제가 없습니다.

그렇습니다. 원하는 것이 가능하지만 노예가 열려있게해야합니다. 오픈 드레인처럼 동작 할 수 없다면 (쇼트 키) 다이오드를 각 출력과 직렬로 연결하여 속임수를 쓸 수 있습니다.

열거 방식은 Dallas 단선 버스와 열거 및 CAN 버스와 동일합니다.

그러나 접근 방식의 심각한 단점은 풀업 저항으로 구동되는 상승 시간에 따라 속도가 제한된다는 것입니다. 푸시 풀 출력으로 구동 할 때보 다 속도가 느리고 버스를 작동 할 수있는 속도를 제한 할 수 있습니다.

각 슬레이브에 여분의 핀이 2 개 있으면 데이지 체인 방식으로 연결하고 데이지 체인에서의 위치를 ​​기준으로 열거 방식을 사용할 수 있습니다.


예, 속도를 줄여야한다는 말을 잊었습니다 (4Mpbs에서 128Kbps로 약 20 배 감소). 그것은 초기 단계이며 내 알고리즘은 느린 속도를 처리 할 수 ​​있습니다 (아직도 빠릅니다). 불행히도, 지금 우리는 하드웨어를 재 설계하지 않을 것입니다. 비용은 단순히이 단계를 무시하고 마스터에게 어떤 ID를 기대해야하는지 알려주는 것 이상입니다.
Shahbaz

질문으로 돌아가서, 이미 슬레이브를 오픈 드레인으로 구성했습니다. 마스터를 어떻게 구성해야합니까?
Shahbaz

1
풀업을 제외하고 마스터의 MISO 핀에는 특별한 것이 없습니다. 풀업 디자인으로 128Kbps에 도달하지만 YMMV에 도달하지는 않을 것입니다. 심도있는 I2C 문서를 읽는 것이 도움이 될 수 있습니다. 즉, 와이어 또는 풀업 버스이므로 적용되는 모든 트릭이 도움이 될 수 있습니다.
Wouter van Ooijen

고마워 나는 어떻게되는지보기 위해 버스 속도를 늦추려고 노력할 것이다. 나는 이러한 풀업, 오픈 드레인 및 다른 사람들이 실제로 무엇을 의미하는지 연구하고 이해해야합니다. (여기 소프트웨어 엔지니어!)
Shahbaz

1
버스에 오실로스코프를 놓고 어떤 일이 발생하는지 확인하십시오. 상승 시간이 너무 느릴 수 있지만 벨이 울릴 수도 있습니다.
Wouter van Ooijen

4
  • 마스터의 MISO를 풀업으로 설정하고
  • 모든 슬레이브의 MISO를 오픈 드레인으로 설정하십시오.

이것을 시도했지만 단일 슬레이브 조차도이 구성이 작동하지 않습니다 (오실로스코프는 라인에 일정한 영점을 표시합니다).

풀업 모드에서 마스터 I / O 핀의 등가 저항이 무엇인지 확인해야합니다.

일반적으로 풀업 모드는 저항이 50kOhms 이상으로 매우 높습니다. emi 또는 기타 노이즈로 인해 핀이 글리치되지 않도록하거나 매우 느린 제어 신호의 기본값을 설정하는 동시에 너무 많은 전력을 낭비하지 않도록하기위한 것입니다.

Wouter가 지적했듯이 오픈 드레인 버스에서 속도는 풀업 저항에 의해 제한됩니다. 높은 저항 값은 버스를 느리게 만듭니다. I2C의 일반적인 값 (100 또는 400kHz를 얻음)은 1 ~ 5kOhm입니다. 비슷한 속도를 얻기 위해 비슷한 풀업 저항을 원할 것입니다.

이 방식을 사용하려면 마스터의 I / O 핀 풀업 대신 외부 풀업 저항 (1-5kOhm 정도)을 사용해야한다고 생각합니다.


힌트 주셔서 감사합니다. 저는 전자 제품 전문가는 아니지만 동료에게 제안 사항을 살펴 보도록 요청해야합니다. 유선 또는 프로그램의 초기 단계에만 필요하며 정상 단계에서는 핀이 풀업으로 구성되지 않습니다. 따라서 외부 저항은 옵션이 아닙니다.
Shahbaz

마스터 마이크로에 하나의 무료 I / O 핀이있는 경우 5 kOhms를 통해 버스에 연결할 수 있습니다. 그런 다음 버스 열거 중에는 높게 설정하고 일반 통신 중에는 Z를 높게 설정하십시오.
광자

1

유선 및 버스가 작동하려면 버스의 노드가 개방 드레인이어야합니다. 즉, 전송해야합니다

  • 강하게 내리면 로직이 낮아지고
  • 버스에서 분리하여 로직 하이.

또한 버스를 약하게 당겨야합니다.

단일 비 전송 마스터와 단일 전송 슬레이브에서 볼 수있는 독특한 동작은 마스터가 강하게 당겨 지거나 슬레이브가 약하게 당겨져 설명 될 수 있습니다.

위 중 어떤 것이 발생하는지 확인해야합니다.

슬레이브를 고 임피던스 모드로 설정하고 10k 저항을 통해 버스를 접지에 연결하십시오. 라인 전압이 크게 변하지 않으면 마스터가 강하게 당기고 있으므로이를 수정해야합니다. 그렇지 않으면 슬레이브와 동일한 절차를 수행하십시오 (이번에는 저항을 Vcc에 연결하십시오). 선간 전압이 크게 상승하면 슬레이브가 약하게 내려 가고있는 것입니다 (고정). 그렇지 않으면 주위의 시간 공간 왜곡을 찾으십시오.


전자 제품에 대한 나의 무지를 실례 합니다만, 노예가 강하게 내려 가면 버스가 AND로 작동하지 않습니까? 나는 높은 것을 원하는 노예의 연결이 끊어지고 낮은 것을 원하는 노예가 풀리고 있기 때문에 전체적인 결과가 떨어졌기 때문에 그렇지 않습니다.
Shahbaz

@Shahbaz, 나의 나쁜 것은 물론 버스는 유선 일 것이다. 그리고 나는 대답을 고쳤다. 유선 또는 극성을 원한다면 극성을 반대로하십시오 (마스터 풀다운이 약하면 슬레이브가 강력하게 풀립니다).
avakar

Wikipedia에서 읽었을 때, 그것들을 유선 또는 유선 또는 음의 논리로 지칭한다는 것을 깨달았습니다.
Shahbaz

1

버스에서 수동 풀업 또는 풀다운을 사용하고 (풀업이라고 가정하겠습니다), 노예가 말할 것이있을 때 버스를 적극적으로 운전하고 (높게 운전하고 낮게 운전) 제안합니다. . 주소와 마스크를 사용하는 쿼리 주소 명령이 있고 각 슬레이브가 주소와 마스크를 좋아하는지 여부에 따라 00을 출력하거나 아무것도 출력하지 않도록 지시합니다. 가능하면 슬레이브가 운전을 시작하기 전에 일정 시간 동안 마스터가 적극적으로 버스를 운전하게하십시오. 풀업의 강도와 마스터가 버스를 높게 구동하는지 여부에 따라 슬레이브가 느리게 당겨지기 전에 설정 단계에서 버스 속도를 제한해야 할 수도 있습니다. 반면에 설정이 완료되면


두 슬레이브가 적극적으로 높고 낮게 운전하면 버스에서 무엇을 읽을 것으로 예상됩니까?
Shahbaz

한 노예는 운전을 피하고 다른 노예는 운전을 피해야합니다. 슬레이브는 (1) 버스가 유일한 일임을 알거나 (2) 버스를 운전하는 다른 모든 사람이 수동 유휴의 반대 방향으로 버스를 운전할 것임을 알고있을 때만 버스를 운전해야합니다. 상태.
supercat

이것이 무엇을 의미합니까? ... 선택된 각각의 슬레이브가 능동적으로 높은 레벨과 낮은 레벨을 구동하게하면 버스는 다음과 같이됩니다.
Shahbaz

@Shahbaz : 슬레이브가 할 말이있을 때, "1"비트를 전송하려면 버스를 적극적으로 높이고 "0"비트를 전송하려면 낮게 버스를 구동해야합니다. 노예가 할 말이 없으면 버스를 전혀 운전해서는 안됩니다. 슬레이브가 "1"비트를 보내려고 할 때 버스를 활발하게 구동 시키면 버스가 고속으로 구동하기 위해 수동 풀업에 의존하는 것보다 훨씬 빠르게 버스가 작동 할 수 있습니다.
supercat

@Shahbaz : 슈퍼 캣이 말하려고하는 것은 열거 상태에서 저항이 라인을 끌어 올려야하며 슬레이브는 "0"을 보내거나 아무것도 보내지 않아야하지만 (오픈 드레인 출력), 그 후에 정상적인 통신에서는 단일 슬레이브는 한 번에 활성화되어야하며 활성 슬레이브는 "0"또는 "1"(정상 출력)을 보내야합니다. 따라서 풀업 저항과 라인 커패시턴스는 열거하는 동안 비트 전송률 만 제한합니다. 그 후, 정상적인 통신에서, 능동 구동이 허용하는대로 비트 레이트가 더 높아질 수있다.
Laszlo Valko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.