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 바이트를 추가하는 결과 값의 크기는 바이트입니다.피>