[英]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.