SPI 24位地址器件的C结构

时间:2015-03-30 08:35:18

标签: c microcontroller spi

我正在与具有24位地址和16位偏移的SPI音频记录IC进行通信。我做了一个结构来读取/写入该设备的数据,

命令 - 1个字节 地址 - 3字节(24位) 偏移地址 - 2字节(16位)

在仿真期间(有害),发现第4个字节(地址的MSB)与第5个字节(偏移的LSB)重叠。

以下是代码。请帮助我在代码中进行哪些更改。

typedef struct {
unsigned  char Command:8 ;
unsigned  long Addr:24;
unsigned  int Offset:16;
} ISD_Struct;
ISD_Struct ISD_Rec;
void main()
{
    address = 0x563412 ;
    OFFST   = 0x9A78 ;
    ISD_Rec.Command = 0xBC;
    ISD_Rec.Addr    = address;
    ISD_Rec.Offset  = OFFST;
    Write_SPI(&ISD_Rec,6); //sending  (1byte command + 3byte address + 2 byte offset)
    //Delay_ms(1000);
}

由于

2 个答案:

答案 0 :(得分:0)

如果你真的想要一个打包的结构,最好的方法是

typedef struct {
unsigned  char Command;
unsigned  char Addr[3];
unsigned  char Offset[2];
} ISD_Struct;
ISD_Struct ISD_Rec;

如果您的编译器没有24位数据类型(很可能),那么这是唯一可行的方法。这也将避免对齐问题,以及endiann-ness的潜在问题。当然,您必须进行一些字节移位和屏蔽来设置单个字节,但这很简单。

您可以添加assert(sizeof(ISD_REC == 6))作为完整性检查。

答案 1 :(得分:0)

您的结构应定义为:

typedef struct {
    unsigned long Command :8;
    unsigned long Addr :24;
    unsigned long Offset :16;
} ISD_Struct;

类型更改引入了填充以对齐long成员。请注意,大多数位域机制都是实现定义的,因此如果更改平台/编译器,请检查这是否按预期工作。您可以使用offsetof进行静态检查。