Team for GR-PEACH Producer Meeting

SPIのクロックについて

04 Dec 2014

SPIのクロックですが一桁少なくないでしょうか? 初期化後のデフォルトが1MHzだと思うのですがオシロ上では128kHz程度になっております。 frequency設定で1,000,000(1MHz)でも同様128kHz程度、5,000,000(5MHz)で694kHz、10,000,000(10MHz)で1.39MHzと分周比の関係上誤差が出てきますのでずれはしょうがないとしますが。 当方の勘違いかも知れませんがお時間あればご確認お願い致します。

04 Dec 2014

確かに変だったので、mbed-srcの中にあるspi_api.cを修正して1MHzになるようにして見ました。

spi_api.c 抜粋

void spi_frequency(spi_t *obj, int hz) {
    spi_disable(obj);
   const int P1CLK = 66666666; 
    uint8_t div, brdv;
//    uint16_t mask = 0x000c0;     ←間違い
    uint16_t mask = 0x000c;

spi_api.cのある場所は下記の通りです。
/media/uploads/abanum/spi_api.jpg

mbed-srcの修正ってpullリクエスト出せばいいんですかね?

05 Dec 2014

abanumさん
私も上記変更で動作確認できました。助かりました。
修正は他にもあるでしょうから「中の人」にお任せしたらいかがでしょうか(いつかこのページに反応があるでしょうから)?

私の確認テスト中に、SPIポートアサインの誤記を発見したのでレポートしておきます。
D13(SCK)/ D12(MOSI)/ D11(MISO)
ここに書かれています。
http://www.core.co.jp/product/m2m/gr-peach/
同じく、ここにも書かれています。
https://developer.mbed.org/platforms/Renesas-GR-PEACH/
こちらは、MOSIとMISOが逆です。
前回、I2Cのピンアサインが違っていたので、指摘させていただきました。
http://developer.mbed.org/forum/team-886-GR-PEACH_producer_meeting-community/topic/5326/
従って、この経験からピンアサインはCOREさん資料でなければ信用できないと思ってテストしていましたが、今回はそれで長い時間はまりました。
D13(SCK)/ D12(MISO)/ D11(MOSI)が正しい!
ピンアサイン誤記では、一勝一敗の五分となりました。

06 Dec 2014

gdgd開発者です。

当方もこの間違いで昨日までSPIと格闘しておりました・・・ お配りした資料及びコアサイトのSPI0(D11/D12)のMOSI/MISOの記載が逆でした。 修正致します。 お手数おかけして申し訳ありません。

08 Dec 2014

本件、ご報告ありがとうございました。
現在対応中です。

11 Dec 2014

遅くなりましたが、ご指摘のマスク値を修正しました。
ご自身のプロジェクトの mbed-src を右クリックして update を選択すると、修正が反映されます。
/media/uploads/RyoheiHagimoto/mbed-src_update.png

11 Dec 2014

小出しで申し訳ありません。
spi.format(16,3) または spi.format(32,3)の場合ハングアップします。

下記のコードで試したところ、16ビットの時は"4"まで行き、32ビットの時は"1"までしか行きません。

SPI ビット数テスト

#include "mbed.h"

DigitalOut myled(LED_USER);
Serial pc(USBTX, USBRX); // tx, rx
SPI spi(D11, D12, D13); // mosi, miso, sclk
DigitalOut cs(D10);

int main() {
    // Chip must be deselected
    cs = 1;
    // Setup the spi for 8 bit data, high steady state clock,
    // second edge capture, with a 1MHz clock rate
pc.printf("1");
    spi.format(32,3);
pc.printf("2");
    spi.frequency(1000000);
pc.printf("3");
 
    while(1) {
    // Select the device by seting chip select low
    cs = 0;
 
    spi.write(0x0058);
pc.printf("4");
 
    spi.write(0x58);
pc.printf("5");
 
    // Deselect the device
    cs = 1;
       myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}

お手数ですがご確認願います。

12 Dec 2014

本件、ご報告ありがとうございました。 確認いたします。

15 Dec 2014

ひろちゃんです

☆GettingStarted_JPNに記載の、SPIのプログラムを実行しました。 上記の様に、初期化後のデフォルトが1MHzだと思うのですがオシロ上では128kHz程度になっております。 SPIスレーブは無し。

☆update を選択して、修正を反映しました。 クロックは、1MHzになるのですが、最初の転送と転送の間が広くなりすぎでは?

記憶ですが、修正前は、クロックは一桁程おかしいのですが、転送と転送の間は同程度でした。

次の波形は、

上:30回転送している。50uS/目盛。

下:拡張波形。クロックは1MHz。2uS/目盛。

☆思うに。 このボードの性格は、マイコン型かパソコン型か?

マイコン型なら、時間間隔は相対的に正確で有ってほしい。

パソコン型は、OSの関係で不定期に時間間隔の乱れが有る。

私は、マイコン型と思うのですが。

/media/uploads/kagawahi/peachspi1.jpg /media/uploads/kagawahi/peachspi2.jpg

15 Dec 2014

SPIのデバイスが手元に無いので...MOSIだけ確認してみました。

このコードでは、最初に遅い動作は見受けられませんでした...。

mbed-srcはRev.439です。

int main()
{
    SPI spi(D11, D12, D13); // mosi, miso, sclk
    spi.frequency(1000000);

    DigitalOut calling(D15);
    uint8_t i = 0;
    for (;;)
    {
        if (i % 8 == 0) wait_us(10);
        
        calling = 1;
        spi.write(i++);
        calling = 0;
    }
}

/media/uploads/matsujirushi/20141215a.png /media/uploads/matsujirushi/20141215b.png

15 Dec 2014

GettingStarted_JPNに記載の、SPIのプログラムで再現しました。

どうやら、初回のwait_ms()が遅いようです。

仕方ないのかも。 /media/uploads/matsujirushi/20141215c.png

21 Dec 2014

spi.format(16,0);が正しく動作しないようなのでマニュアルとコードを読んでみたところ。

  • 1 データコントロールレジスタ設定が抜けている(SPDCR)
  • 2 UINT8[0]でデータのやり取りをしている(SPDR)

この2点を下記のように修正したら動作しました。(16Bit,mode0の場合のみ検証、32Bitも一応動いている模様)

spi_api.c

------略----------
int bitsg = 8;
void spi_format(spi_t *obj, int bits, int mode, int slave) {
spi_disable(obj);
bitsg = bits;
MBED_ASSERT(((bits >= 4) && (bits <= 32)) && (mode >= 0 && mode <= 3));
------略----------
switch (bits) {
    case 8:
        RSPI[obj->spi]->SPDCR = 0x20;//8Bit
        DSS = 0x7; break;
    case 16:
        RSPI[obj->spi]->SPDCR = 0x40;//16Bit
        DSS = 0xf; break;
    case 32:
       RSPI[obj->spi]->SPDCR = 0x60;//32Bit
       DSS = 0x2; break;
    default:
       error("SPI module don't support other than 8/16/32bits");
       return ;
}
------略----------
static inline void spi_write(spi_t *obj, int value) {
    while (!spi_writable(obj));
    switch (bitsg) {
        case  8: RSPI[obj->spi]->SPDR.UINT8[0] = value;   break;
        case 16: RSPI[obj->spi]->SPDR.UINT16[0] = value;  break;
        case 32: RSPI[obj->spi]->SPDR.UINT32 = value;     break;
        default: RSPI[obj->spi]->SPDR.UINT8[0] = value;   break;
    }
}

static inline int spi_read(spi_t *obj) {
    //while (!spi_readable(obj));//
    switch (bitsg) {
        case  8:    return RSPI[obj->spi]->SPDR.UINT8[0];
        case 16:    return RSPI[obj->spi]->SPDR.UINT16[0];
        case 32:    return RSPI[obj->spi]->SPDR.UINT32;
        default:    return RSPI[obj->spi]->SPDR.UINT8[0];
    }
}
------略----------

16Bit DACで500HzのSIN波を出力。 /media/uploads/KubotaP/20141221-0002.jpg

22 Dec 2014

大変お待たせして申し訳ありません。
spi.format()関数に対応いたしました。
ご自身のプロジェクトの mbed-src を右クリックして update を選択すると、使用可能になります。

24 Dec 2014

大変申し訳ありません。
12/22にRyo Hagimotoからコメントしました、mbed-srcの更新に関して、
現在、mbed-srcをupdateしても、
今回の修正が反映されない現象が確認されています。
原因を確認しております。
改善次第、ご連絡いたします。

今回の修正内容については、別の方法でご提供致します。
準備が出来次第、ご連絡致します。

25 Dec 2014

お待たせ致しました。
12/22にRyo Hagimotoからコメントしました、mbed-srcの更新を反映したLibraryを、
暫定版として以下にアップ致しました。
http://developer.mbed.org/teams/GR-PEACH_producer_meeting/code/mbed-src-v442-pre/

上記URLにアクセスし、画面右側、
Repository toolboxからImport this libraryをクリックすると、mbed-src-v442-preを取得できます。
ご自身のprojectのmbed-srcを、mbed-src-v442-preに差し替えをお願い致します。
mbed-src全体の差し替えがNGな方は、大変お手数ですが、下記ファイルの差し替えをお願い致します。

libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/

  • PeripheralNames.h
  • ethernet_api.c
  • i2c_api.c
  • objects.h
  • pwmout_api.c
  • serial_api.c
  • spi_api.c

    mbed-srcのupdateに関する問題が解決するまで、
    お手数をお掛けいたしますが、よろしくお願い致します。