我正在与具有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);
}
由于
答案 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
进行静态检查。