繁体   English   中英

SPI 24位地址设备的C结构

[英]C structure for SPI 24-bit address device

我正在与具有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);
}

谢谢

如果您真的想要压缩结构,最好的方法是

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

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

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

您的结构应定义为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM