8 years, 1 month ago.

SPISlaveが受信しない問題について

LPC4088にLPC1768をSPI通信で動作させようとしています。スレーブ(LPC1768)側のプログラムがうまく動きません。 Cooltermで調べる限りではdevice.receive()が動いていないので、マスター側から送信されていてもスレーブ側が受信→動作を行っていないと思われます(printfで調べた痕跡が多数存在するのはご容赦ください)。spi.hやSPISlave.hのヘッダファイルやライブラリを別途加えて走らせた方がよいのでしょうか? プログラム上は16進数を受信した数に反応してボード上のLEDが点灯するようになっています。

マスター側プログラム(LPC4088)

  1. include "mbed.h"

DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4);

SPI spi(p5, p6, p7); mosi, miso, sclk DigitalOut cs(p8);

Serial pc(USBTX, USBRX); tx, rx

int main() { led1=0; led2=0; led3=0; led4=0;

Setup the spi for 8 bit data, high steady state clock, second edge capture, with a 1MHz clock rate spi.format(8,3); spi.frequency(1000000);

Select the device by seting chip select low cs = 0;

while(1) { led1=0; led2=0; led3=0; led4=0; Send 0x8f, the command to read the WHOAMI register spi.write(0x8F); led1=1; led2=0; led3=0; led4=0; wait(1.0); pc.printf("done_0x8f\n"); Send a dummy byte to receive the contents of the WHOAMI register spi.write(0x0c); led1=0; led2=1; led3=0; led4=0; wait(1.0); pc.printf("done_0x00\n"); Deselect the device cs = 1; } }

スレーブ側プログラム(LPC1768)

  1. include "mbed.h"

DigitalOut sw1(LED1); DigitalOut sw2(LED2); DigitalOut sw3(LED3); DigitalOut sw4(LED4);

DigitalOut lamp(p25);

int i;

SPISlave device(p5,p6,p7,p8); mosi, miso, sclk, ssel

Serial pc(USBTX, USBRX);

int main() { device.reply(0x00); Prime SPI with first reply sw1=0; sw2=0; sw3=0; sw4=0; lamp=0; printf("start\n"); while(1) { i++; printf("loop %d\n",i); if(device.receive()) { int v = device.read(); Read byte from master sw3=0; printf("receive\n"); if(v==0x8F){ sw1=1; sw2=1; printf("WHOAMI register = 0x%X\n"); lamp=1; wait(0.5); printf("done_1\n"); } else{ sw1=0; sw2=0; lamp=0; wait(0.5); printf("done_2\n"); printf("WHOAMI register = 0x%X\n"); } v = (v + 1) % 0x100; Add one to it, modulo 256 device.reply(v); Make this the next reply } } }

1 Answer

8 years, 1 month ago.

同じ条件で確認してみましたが、LPC1768の方からは正常と思われるログが出力されました(ループ中の printf("loop %d\n",i) はコメントアウトしました)。

start
receive
done_2
WHOAMI register = 0x3723

LPC4088 と LPC1768 間の接続を確認されてはいかがでしょうか(特に GND が共通になっているかとか)。