데이터 시트에서 Arduino SPI

를 사용하여 데이터를 읽는 방법에는 32 비트 데이터를 얻기 위해 32 개의 직렬 클록을 적용해야한다고 명시되어 있습니다. 어떻게 할 수 있습니까? 제가 아두 이노라고 프로그램하나요?

댓글

  • SPI 라이브러리의 예제를 열어서 확인하는 것이 좋습니다. 어쨌든 코드는 byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); 그러면 result에서 필요한 32 비트를 찾을 수 있습니다.
  • 이미 해봤지만 에너지 칩 내가 사용하고있는 STPM10은 MOSI가 연결되지 않은 곳에서 단순 동기 SPI를 사용해야한다는 것을 제안합니다. 바이트 읽기와 쓰기에서 전환하는 타이밍 다이어그램 만 있습니다 .SPI.transfer ()를 사용했을 때 데이터는 그렇지 않습니다. 안정적이고 신뢰할 수 없다고 생각합니다
  • 그것이 신뢰할 수 없다고 어떻게 말합니까? 주변 장치는 전이 중이며 작동 방식에 따라 데이터를 수신하는 유일한 방법은 더미 데이터를 보내는 것입니다. MOSI가 연결되어 있지 않습니다. ' 중요하지 않습니다. ; 그러나 ' 다른 작업에는 MOSI 핀을 사용할 수 없습니다. 그런데 다른 주변기기의 슬레이브 선택 핀을 올바르게 설정 한 것을 기억 했습니까? arduino 보드 또는 다른 보드의 SS 핀을 사용 했습니까?

Answer

4 번, 적절한 비트 이동 후 반환 된 값을 변수에 저장할 때마다.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

가장 중요하지 않은 것으로 가정합니다. 바이트가 먼저 수신됩니다. 데이터 시트에 표시된대로 SPI 모드가 올바른 모드인지 확인하세요.

슬레이브가 바이트 간 어설 션 해제를 처리 할 수없는 경우 (SPI.transfer() 거래가 끝나면 st2000의 하드웨어 SPI 접근 방식을 시도하거나 shiftIn()와 함께 bitbanged SPI를 사용할 수 있습니다.

댓글

  • 이게 효과가 있을지 모르겠습니다. SPI 슬레이브가 어떻게 반응할지 가정하기 전에 SPI 슬레이브가 어떻게 작동하는지 알아야합니다. 또한 Chip Select 라인이 각 8 비트 SPI 트랜잭션에 대해 어설 션 및 어설 션 해제되면 SPI 슬레이브가 얼마나 잘 설계 되었습니까? 즉, 이러한 SPI 슬레이브는 SPI 마스터와 쉽게 동기화되지 않을 수 있습니다. 구체적으로, 실제로 읽고있는 8 비트 바이트를 어떻게 확신합니까?
  • @ st2000 OP 톱은 충분한 세부 정보를 제공하지 않는 데 적합합니다. 변경 될 때까지 가정 만 할 수 있습니다.
  • ' 내가 본 모든 예제는 SPI.transfer가 아닌 SPI, transfer (0)를 사용하여 데이터를 읽습니다. (0xff). 또한 데이터 쓰기 에도 SPI.transfer를 사용합니다. 저는 여전히 ' 당신이 실제로 데이터를 읽을 때 SPI가 0 또는 0xff로 무엇을하는지 알아 내지 못했습니다. 이것이 슬레이브로 전송됩니까?
  • @ S.Imp They ' 더미 바이트입니다. 당신은 당신이 보내고 싶은 것을 보낼 수 있습니다. 다른 쪽의 장치는 데이터를 지불하더라도 여전히 그것들을 버릴 것입니다. SPI.transfer()는 SPI의 본질적인 전이중 특성으로 인해 항상 부분적으로 사용되며 (첫 번째 요소의 결과로) 부분적으로는 대부분의 MCU가 SPI 주변 장치를 구현하는 방식 때문입니다. 시계가 실행되기 시작하면 MOSI 및 MISO 라인에 항상 " 데이터 "가 있습니다. ' 버스의 각 참가자가 읽을 지 여부를 결정하고, " 데이터 는 의미가 있거나 없습니다.
  • ' 할 수 있다고 말하는 것이 완전히 틀린 것은 아닙니다. ' SPI 버스에 쓰지 않고 진정으로 읽을 수 없으며 그 반대도 마찬가지입니다. 따라서 사용 사례를 일반화하기 위해 한 레지스터에서 한 바이트를 사용하고 8주기 후에 다른 (또는 동일한) 레지스터에서 한 바이트를 반환하는 주변 장치를 설계하는 것이 좋습니다. 그런 다음 ' 사용자의 ' 애플리케이션이 ' 처음에 기록 된 바이트 (TX) 또는 다시 읽은 바이트 (RX) 또는 둘 다 (TX 및 RX)에만 관심이 있습니다. 또한 읽기 및 쓰기 역할을 모두 제공하므로 모호한 이름 transfer()입니다.

Answer

Sparkfun은 SPI가 무엇인지 잘 설명합니다.
https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi

Arduino IDE에는 IDE와 함께 제공되는 SPI 라이브러리가 있습니다.
http://www.arduino.cc/en/Reference/SPI

라이브러리에는 두 가지 예가 있습니다.
SPI를 사용하여 기압 센서 읽기
SPI를 사용하여 디지털 전위차계 제어

답변

목표는 다음을 사용하여 32 비트를 읽는 것입니다. (알 수없는) 장치의 SPI 포트.

장치가 SPI 칩 선택 라인 활동 (각 8 비트 바이트 읽기에 대해 비활성에서 활성에서 비활성으로 이동)을 허용하는 경우 4 연속 8을 수행하여 원하는 32 비트 데이터를 얻을 수 있어야합니다. 비트 SPI가 읽습니다.

그러나 장치가 위의 SPI 칩 선택 라인 활동을 허용하지 않는 경우 (즉, 장치가 전체 32 비트 SPI 트랜잭션에 대해 활성화되도록 SPI 칩 선택을 요구하는 경우), SPI Chip Select 라인을 제어하지 않고 32 비트 트랜잭션을 4 개의 개별 8 비트 SPI 트랜잭션으로 분리 할 수 없습니다. 다음 코드 예제는이 작업이 수행되는 방법을 보여줍니다.

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

위의 예제는 Arduino SPI 라이브러리에서 가져온 것입니다. 웹 페이지 이며 16 비트 (32 비트 아님) 전송입니다. 32 비트 전송을 코딩하려면 SPI_CONTINUE 매개 변수를 사용하여 SPI.transfer 메소드를 계속 호출하십시오.

나중에 추가됨 …

사람들이 DueExtendedSPI 메소드의 사용을 권장하지 않는 것 같습니다. . 그리고 SPISettings 및 SPI.beginTransaction ()이 사용됩니까? 그렇다면 이 페이지 는 코드가 SPI 칩 선택 라인을 명시 적으로 제어하는 예제 코드를 보여줍니다 (&에서 slaveAP를 찾으십시오. slaveBPin). 코드가 슬레이브 A에서 24 비트를 읽고 슬레이브 B에 8 비트를 쓰는 방법에 유의하십시오. 24 비트 대신 32를 읽으려면 코드 세그먼트를 다음과 같은 방식으로 변경해야합니다 (몇 가지 다른 지원 변경 사항 포함). / p>

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

설명

  • 더 많은 것을 구성하려면 슬레이브 SPI 장치의 사양을 확인해야합니다. 구체적인 답변입니다.
  • 저는 STPM10 평가 보드를 사용합니다. 연결은 단순 동기 SPI이며 Arduino의 MOSI는 아무것도 연결되지 않습니다. 읽기 전용과 쓰기 전용에서 전환하는 타이밍 다이어그램이 있습니다. 내 문제는 칩의 레지스터에서 데이터를 읽는 방법입니다. SPI.transfer를 사용했지만 ' 데이터가 신뢰할 수 있다고 생각하지 않습니다.
  • 11 페이지에있는 STPM10 타이밍 다이어그램 '의 사양이 표준 SPI 트랜잭션처럼 보이지 않습니다. Arduino SPI 라이브러리를 사용할 수 없다고 말하는 경향이 있습니다. 대신, 당신은 이것을 소프트웨어에서 완전히 비트 뱅해야 할 수도 있습니다. 예를 들어, 표준 SPI 버스에 " SYN " 라인이 있다고 생각하지 않습니다. 그리고 저는 ' SPI 거래가 끝나기 전에 Chip Select 라인이 높아야한다고 생각하지 않습니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다