1

我有一个嵌入式 SBC(主)和从属一个基于 8051 的射频模块,它具有 32kbs 的内部 ROM。我有 SPI 总线来访问该内部 ROM。当我使用 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",);   
    }

我想从缓冲区中读取我的第二个字节。请让我知道我在做什么错?而且我需要让我的地址不断变化,我想在第零个地址上写第一个字节等等。

问候,拉维

4

1 回答 1

0

我不太熟悉您的特定应用程序,所以我真的不知道当您在设备库中调用“写入”和“读取”时会发生什么。但是,从纯 C/C++ 的角度来看,我注意到一些可能需要也可能不需要注意的事情。据我了解,您想通过 SPI 总线将 4 个字节的数据写入内存的前 4 个字节。在您的写入循环中,我看到了几件事。

首先,您循环 4 次,每次写入 4 个字节。总共是 16 个。另外,当您写作时,我根本看不到“地址”在哪里发挥作用。我注意到您正在传递 uint* 数组的地址的“值”数组。write 函数需要一个 void*,而您实际上是在传递一个 void***。这意味着您绝对没有写入您声明的值数组中的字节。

所以在我看来,你可以像这样写 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);

您可以像这样从缓冲区中打印第二个字节。

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

我曾使用过一些微控制器,并且之前没有使用文件描述符在 SPI 总线上读/写。所以我希望这会有所帮助。

于 2012-12-09T06:17:19.303 回答