를 사용하여 데이터를 읽는 방법에는 32 비트 데이터를 얻기 위해 32 개의 직렬 클록을 적용해야한다고 명시되어 있습니다. 어떻게 할 수 있습니까? 제가 아두 이노라고 프로그램하나요?
댓글
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 라인이 높아야한다고 생각하지 않습니다.
byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00);
그러면result
에서 필요한 32 비트를 찾을 수 있습니다.