Serial Peripheral Interface(SPI)에 의해 개발되었 모토로라를 허용하는 칩과 통신하는 각각 다른 많은 Philips 고안 I2C 직렬 버스에 대한 자신의 집적 회로. 이러한 두 개의 버스는 주로 동일한 작업을,모두가 거의 똑같이 평범하며 많은 주변 장치의 사용이나 다른 통신할 호스트와 함께 마이크로 제어기. 이 편재성은 임프가 두 가지를 모두 지원하는 이유입니다.

SPI 는 I2C 에 비해 몇 가지 장점,특히 더 높은 데이터 전송 속도를 지원합니다., SPI 에는 또한 동시 양용 커뮤니케이션을 요구하는 그 신청을 위해 특히 적당한 만드는 이중 기능이 있습니다.

On the other hand,SPI 필요 최소 세 개의 와이어가 공유하여 모든 장치에서 버스와 숫자의 장치가 선택한 라인이 각 주변 장치 컨트롤러에 연결된 장치입니다. I2c 는 대조적으로,단지 두 개의 전선을 필요로;그것은 버스의 모든 장치를 식별하는 고유 한 주소를 사용합니다., 이과 함께 작업한 여러 장치는 것보다 더 간단 SPI 주소 보다 적게 접근하지만,일부 개발자가 선호하는 하드웨어를 사용하여 장치를 선택하기보다는 주소이다.

컨트롤러 및 주변 장치

SPI 는 장치를’컨트롤러’및’주변 장치’로 분리합니다. 하나의 장치 만 타이밍 펄스를 보내 데이터 전송을 동기화 할 수 있으며 컨트롤러로 선택한 장치입니다. 컨트롤러와 타이밍을 동기화하는 다른 모든 것은 자회사 주변 장치로 간주됩니다., 컨트롤러는 귀하의 제품에 있어야합니다 그 imp—와 그 주변기기할 수 있는 모든 송신 및 수신 데이터,하지만 컨트롤러를 설정할 수 있 타이밍 패턴을 하는 그들이 모든 작동합니다. 고정 된 타이밍 방식의 이러한 확립은 I2C 와 같은 SPI 를’동기식’버스로 만드는 것입니다.

물리적 버스

imp 의 SPI 구현에는 컨트롤러에서 직렬 클럭 신호 인

  • SCLK 의 네 줄이 있습니다.
  • COPI,’Controller Out,Peripheral In'(때로는 오래된 데이터 시트에서 mosi 라고 표시됨)의 줄임말입니다.,
  • CIPO,’Controller In,Peripheral Out'(때로는 된장이라고 표시됨)의 줄임말.
  • CS,’Chip Select'(때로는 ss,nSS 또는 SYNC 로 표시됨)의 줄임말

COPI 및 CIPO 는 데이터 전송 라인입니다.

imp001 및 imp002 는 전용 CS 핀을 제공하지 않습니다.대신이 imp 의 다른 GPIO 핀을 사용할 수 있습니다. Imp003 및 up 은 imp pin mux 페이지에 표시된 spi 버스의 일부로 전용 CS 핀을 제공합니다.

참고 imp005 는 두 개의 SPI 버스 각각에 전용 칩 선택 핀을 제공합니다. SpiBCAD 의 경우 핀 D;spi0 의 경우 핀 CS0 입니다., Imp API 방법 chipselect()를 사용할 수 있습의 주장과 데 주장의 이러한 칩을 선택하는 핀(참조하십시 방법을 설명서)를 이용하실 수 있습니다.


SPI 에 imp:는 최대 네 개의 라인을 연결하는 하나의 주변 장치

이 방법을 다음과 모토로라의 정의 SPI:는 각 버스 트랜잭션으로 일괄 데이터 바이트로 링크되어야 하는 특정 주변., Texas Instruments 는 spi 사양을 수정하여 각 바이트를 특정 주변 장치로 보낼 수 있도록했지만 전용 CS 라인이 필요합니다. 이 모드는 현재 어떤 꼬마 도깨비도 지원하지 않습니다.

신호

고 가정하고 우리는 하나의 주변에 연결된 컨트롤러로,커뮤니케이션에 의해 시작되 컨트롤러를 당 CS 선 낮습니다. 대화 할 준비를하기 위해 주변 장치를 알려줍니다. 지금 컨트롤러 전송을 시작 시계 펄스에 따라 SCLK 라며 일반적으로 데이터 전송은 잠긴 상승의 가장자리 서 맥박,비록하지 않는 경우가 있습니다.,


클럭의 데이터 및:imp 보냅 명령,말초 데이터를 반환합니다.

컨트롤러는 지금은 데이터 전송에 COPI 선,적극적으로 운전하는 라인은 높은 신호를 1 개 또는 낮은 0 입니다. 주변을 읽는 신호이 될 수 있는 명령에 대한 센서로 전송될 예를 들어,그것은 반환되는 정보에 CIPO 라인,다시 운전 중인 숙박 시설은 높은 신호를 1 개 또는 운전 낮은 전송하 0., 이 요구 사항에는 라인에 적극적으로 중심이 높거나 낮고,오히려 그것을 해결하는 하나의 상태 또는 다른 저항기를 연결해서,이유는 SPI 지원할 수 있는 속도보다 더 빠른 속도로 I2C 수 있습니다. I2c 는 풀업 저항이 라인을 하이로 반환하는 동안 전송 시간을 잃습니다.

그는 말했다,그럼에도 불구하고 좋은 연습 또한 풀에 CS 라인을 보장하는 때 높은 꼬마 도깨비는 부팅하거나 잠자고,따라서 할 수 없 드라이브이 라인은 높은 수 있습니다. 라인을 높게 유지하면 주변 장치가 데이터 및 클럭 라인의 결함을 무시할 수 있습니다.,

컨트롤러가 원하는 것을 가지고있을 때,그것은 CS 라인을 한 번 더 높게 구동하고 주변 장치는 휴식 할 수 있습니다.

imp SPI 옵션

마 꼬마 도깨비의 독립적인 SPI 버스,액세스의 속성으로 장치의 하드웨어 개체는 인스턴스에서 시작. 각 imp 의 pin mux 표는 제품에서 사용하는 imp 유형에 따라 많은 선택 사항이 있음을 보여줍니다. 이 문서는 imp001 을 사용하고 있다고 가정하므로 다른 imp 로 작업하는 경우 pin mux 테이블을 참조해야합니다., Imp001 의 두 SPI 버스는 모두 버스의 3 선 구현이며 각각 핀 1,8 및 9 및 2,5 및 7 에 연결됩니다. 핀 1 및 5 는 SCLK;8 및 7COPI;및 9 및 2CIPO. 어느 두 개의 버스를 사용하는 것이 좋습 별칭에서 처음:

spi1 <- hardware.spi257;spi2 <- hardware.spi189;

구성하거나 사용하는 것은 단순한 문제를 말하고 imp 얼마나 빨리 당신이 원하는 버스를 실행하고를 제공하는 설정의 상수와 함께 하는 방법을 결정하는 버스 운영:

spi1.configure(modeFlags, speed);

첫째,속도입니다., This is simply an integer value giving the throughput in kiloHertz (kHz):

The specific SPI data rates available (in kHz) are as follows:

imp001, imp002 imp003 imp004m imp005 imp006
spi189 spi257 spiEBCA
spiLGDK
spiAHSR
spiGJKL
spiBCAD
spi0
spiXTUVW
15,000 30,000 18,000 24,000 The SPI data rates
available range
from 5KHz to 22.,8MHz
The SPI is clocked
by dividing 160MHz
by any integer
from 7 to 32,000
inclusive
Min. 187KHz, max. 750KHz
7500 15,000 9000 12,000
3750 7500 4500 6000
1875 3750 2250 3000 All others
937.50 1875 1125 1500 Min. 187KHz,
theoretical max. 24MHz
468.75 937.50 562.50 750
234.,375 468.75 281.25 375
117.1875 234.375 140.,g)장
MSB_FIRST 보내는 가장 중요한 조(기본값)
LSB_FIRST 보내 최하위 비트 첫번째
NO_SCLK SCLK pin 이 사용되지 않습
USE_CS_L 사용할 수 있도록 전용 칩을 선택하 pin(imp005 만)

이러한 결합할 수 있습,필요한 경우 그들을 사용하여,논리 연산자,|하지만,일은 서로 독립적이므로 결합되지 않아야:SIMPLEX_TX 및 SIMPLEX_RX,예를 들어., 을 모두 사용 CLOCK_IDLE_LOW 및 CLOCK_2ND_EDGE,예를 들면,입력하는 대신 하나의 일정한 매개변수로서 구성()메소드를 포함시켜야 할지 모두로 구분하여|호:

spi1.configure(SIMPLEX_TX | MSB_FIRST | CLOCK_IDLE_LOW, 400);

조합을 경우 필요할 수 있습니다 그들은 지정한 주변의 데이터시트,이 바로 명확하지 않을 수 있습니다면 초보자. 데이터 시트는 장치의’SPI 모드’또는 CPOL(클럭 극성)및 CPHA(클럭 위상)값에 대해 이야기 할 수 있습니다., CPOL 과 CPHA 는 클럭 신호의 어느 에지가 데이터 신호를 구동하고 샘플링하는 데 사용되는지를 결정합니다. 이러한 각각의 두 개의 매개 변수가 두 가능한국,대한 네 가지 조합에서는 모든


SPI 모드

SPI 모드 간단히 지수는 사람들의 조합이 아닌 별도의 CPOL 및 CPHA 값입니다. 컨트롤러와 주변 장치는 동일한 CPOL 및 CPHA 값을 사용하여 통신해야하며 따라서 동일한 모드를 사용해야합니다., 여러 주변 장치는 다른 구성을 의미 할 수 있으므로 컨트롤러는 특정 주변 장치와 통신해야 할 때마다 자체를 재구성해야합니다.,다음과 같은 테이블:

데이터를 읽고 쓰

구성된 SPI 버스를 사용하여 write()메서드를 보내는 문자열의 바이트는 주변 장치:

spi1.write("This is an LCD display");

사용할 문자열은 선택사항:보낼 수도 있습니다 blob 의 원시 데이터 바이트:

local blob = blob(4); // Create a four-byte blob...blob.writen(0xDEADBEEF, 'i'); // ...and write a 32-bit value to itspi1.write(blob);

할지 여부를 읽는 문자열이나 blob,당신은 하나의 필요의 imp API 의 두 SPI 읽기 방식:

local bytes = spi1.readblob(8);local inputString = spi1.readstring(16);

정수 값으로 전달된 매개 변수가 각각의 바이트 수를 읽을 수 있으로 blob,문자 수를 넣을 수 있으로 문자열입니다., 물론 한 문자가 한 바이트를 차지하므로이 두 메소드는 동일합니다. 후자는 단순히 blob 을 당신을 위해 문자열로 변환합니다.

SPI 버스의’전이중’특성 때문에 쓰기와 읽기가 항상 동시에 발생합니다. 으로 읽고 쓰기 명령을 우리는 지금까지 본 적이,데이터는 반대 방향으로 이동 하나에서 우리가 관심은 무시하거나 제로. 따라서 문자열을 작성할 때 말하면서 주변 장치에서 imp 에 도착하는 모든 데이터는 무시됩니다., 중 두 개의 작업을 읽고,일치하는 크기의 거짓’제로 바이트를 작성하여 주변:읽으면 당신은 여덟 바이트를,말,여덟 0 는 자동으로 작성됩니다.

이 동시에 두 개의 커뮤니케이션,임프 API 에는 네 번째 방법을 사용하여 결합하는 읽기 및 쓰기:

local inputString = spi1.writeread(outputString);

이 문자열 outputString 밖으로 전송되는 따라 COPI 라인,변 inputString 언어로 번역되지 않았습니다.는 데이터는 바이트가에 CIPO. 문자열이나 블롭을 보내고받을 수 있지만 입력과 출력은 모두 동일한 유형이어야합니다., 그러나 출력 blob 이 크면 입력 blob 은 동일한 크기가됩니다. 마찬가지로 입력 문자열과 출력 문자열은 길이가 동일합니다.

전중 작업과 함께 사용할 수도 있습는 장치를 기대하지 않는 운영하는 방법을 필요로하는 사람들의 읽고 쓰는 거짓’바이트를 특정,non-zero 값입니다. 이 요구 사항이 규칙을 사용하여 정기적인 write(),readblob()및 readstring()방법이 있지만,writeread()를 사용할 수 있습니다 그들의 장소에서 확인하는 장치에서 선호하는 더미 값이 사용됩니다.,

예제 코드

다음 코드와 함께 작동 아날로그 장치 ADXL345 디지털 가속도계,부분을 사용하는 SPI 통신하는 호스트와 함께 마이크로 제어기. 또한 i2c 를 지원하며 칩을 기반으로하는이 Adafruit 브레이크 아웃 보드의 핀은 그에 따라 레이블이 지정됩니다. 칩의 데이터 시트는 아날로그 장치 웹 사이트에서 다운로드 할 수 있습니다.

코드 작동 방식

우리가 사용하는 imp001 의 spi257 버스,앨리어의 시작 부분에 목록으로 spi. 우리는 또한 별칭 핀 8CS 라인입니다. 함수 spiWriteReg()이 사용되는 방법을 보여줍니다., 쓰기 트랜잭션은 CS 줄을 낮게 전환하여 신호를 보냅니다. 다음으로 우리가 쓰고 싶은 레지스터의 주소는 다람쥐 32 비트 부호있는 정수에서 블롭에 써서 8 비트 값으로 변환됩니다. 이 blob 은 SPI 버스에 기록됩니다. 우리는 같은 일을 값으로 우리가 원하는 ADXL345 로 등록하는,그리고 우리는 설정 CS 라인 고시의 종료를 알리는 트랜잭션이 있습니다.,


Adafruit/아날로그 장치 ADXL345

기능 spiReadReg()작품에서 같은 방법으로,이번에 우리가 값을 읽을 데이터 버스 정류장에서 작성 후원 등록의 주소입니다. 이 ADXL345 하려면 약간의 조정이 필요합니다 만들 수 등록 주소에서 이를 인스턴스 비트 7 설정해야에서 표시하기 위해 트랜잭션으로 읽는 작업,그리고 6 비트가 설정해야하는 말 칩는 우리가 기대하는 둘 이상의 바이트를 보낼 수 있다.,

여기서 프로그램 적절한 시작,우리는 ADXL345 칩의 요구 사항에 맞게 imp 의 SPI 버스를 구성합니다. 즉-그것은 SPI 모드 3 을 사용합니다. CPOL 과 CPHA 는 모두 설정되어야합니다-그래서 우리는 configure()호출에서 동등한 imp 매개 변수:CLOCK_IDLE_HIGH|CLOCK_2ND_EDGE 를 사용합니다. 우리는 또한 속도를 100kHz 로 설정했습니다. 다음으로,여기에서 CS 핀으로 작동하는 imp 의 핀(8)은 디지털 출력으로 구성되고 높게 설정된다.


배선 업 ADXL345

프로그램의 다른 기능은 SPI 버스가 아닌 ADXL345 자체를 초기화합니다., ADXL345 는 초기화되고 코드는 레지스터 주소0x00에서 값을 읽어 장치가 버스에 있는지 확인합니다. 이 칩은 자 테스트 모드가 있는 시리즈의 판독값 교정을 촬영 한다;이것이 우리가 할 결과를 저장한다. 나중에 함수 루프()에서 이러한 값은 가속도계에서 최종 판독 값을 조정하는 데 사용됩니다.,

ADXL345 를 저장하고,x,y,z 축으로 샘플 16 비트 값에서 각각 두 개의 8 비트 레지스터;루프()사용 spiReadReg()함수를 획득 각 값의 두 가지 구성요소 및 그 후로 변환하는 단일 값을 곱하여 가장 중요한 256 바이트를 추가하는 결과 값의 크기는 바이트입니다.피>

답글 남기기

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