1

組み込みの SBC (マスター) と 32kbs の内部 ROM を持つ 8051 ベースの RF モジュールをスレーブにしています。その内部 ROM にアクセスするために SPI バスを使用しています。SPI バスを使用してマスターからスレーブにデータを送信しているときに、MOSI ラインでデータを確認でき、そのデータの後にスレーブから応答を取得する必要があります。データがフラッシュ ROM の 00,01,02,03 アドレスに適切に書き込まれるかどうか確信が持てません。MISO ラインにもデータがあると予想していますが、何も得られません。フラッシュ ROM が 4 つのアドレスで始まるかどうか?? 参照用にコードを追加しました。何が間違っているのか教えてください。

    typedef unsigned char uint8;

    void run_test(int fd)
    {
        int i;
        uint8 buffer[20];
        //int size,l,size1;
        uint8 *value[4] = {0xAC,0x53,0xAA,0x55};
        uint8 address=0x0000;

        /*Writing 4 bytes*/

        for(i=0;i<4;i++)
        {
             printf("address:%.4x \t value : %2X\n",address,value[i]);
         write(fd,&value,4);
         address++;
        }
   /*Reading the 2nd byte*/

    read (fd, buffer, sizeof (buffer));
    printf("%2X\n",);   
    }

バッファから 2 番目のバイトを読み取りたいのですが、何が問題なのか教えてください。さらに、アドレスを変更し続ける必要があり、最初のバイトを0番目のアドレスに書き込みたいなどです。

よろしく、ラヴィ

4

1 に答える 1

0

私はあなたの特定のアプリケーションにあまり詳しくないので、デバイスのライブラリで「書き込み」と「読み取り」を呼び出すと何が起こるかわかりません。ただし、純粋な C/C++ の観点からは、注意が必要な場合とそうでない場合があることに気付きました。私が理解しているように、SPI バスを介してメモリの最初の 4 バイトに 4 バイトのデータを書き込みたいと考えていました。あなたの書き込みループには、私が見たことがいくつかあります。

まず、4 回ループし、毎回 4 バイトを書き込みます。つまり全部で16です。また、あなたが書いたときに「アドレス」がどこに作用するのかまったくわかりません。uint* 配列のアドレスを渡している「値」の配列に気付きました。write 関数は void* を受け取り、基本的に void*** を渡しています。これは、宣言した値配列にあるバイトを確実に書き込んでいないことを意味します。

したがって、私が見る方法では、一度に 1 バイト、またはこのように一度に 4 バイト、4 バイトを書き込むことができます。

   int i;
   uint8 value[4] = { 0xAC, 0x53, 0xAA, 0x55 };
   uint8 address = 0;

   // Writing 4 bytes METHOD 1
   for (i = 0; i < 4; ++i)
   {
      write(fd, &(value[i]), 1);
   }

   // Writing 4 bytes METHOD 2
   write(fd, value, 4);

そして、このようにバッファから 2 番目のバイトを出力できます。

   uint8 buffer[20];
   read(fd, buffer, sizeof(buffer));
   printf("%2X\n", buffer[1]);  

私はいくつかのマイクロコントローラーを使用したことがありますが、SPI バスでの読み取り/書き込みにファイル記述子を使用したことはありません。だから私はこれが役立つことを願っています.

于 2012-12-09T06:17:19.303 に答える