【问题标题】:C structure for SPI 24-bit address deviceSPI 24位地址设备的C结构
【发布时间】:2015-03-30 08:35:17
【问题描述】:

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

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

在模拟过程中(在 proteous 中),发现第 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);
}

谢谢

【问题讨论】:

  • 我为 char 命令创建了一个联合:8;和长地址:24;带有长变量。但我无法控制 MSB(第 4 个字节)。

标签: c microcontroller spi


【解决方案1】:

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

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)) 作为健全性检查。

【讨论】:

  • 谢谢。正如您所指出的“当然,您必须进行一些字节移位和屏蔽来设置各个字节,但这很简单。”,我一直在寻找减少这些东西的方法。
【解决方案2】:

你的结构应该定义为:

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

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

【讨论】:

  • 但是正如'xxyxyx'所建议的那样,它可能会导致对齐问题,对吧?
  • @jkj 不会有任何对齐问题。由于long,整个结构将在 4 个字节上对齐,但位字段部分预计不会对齐(您将如何对齐 24 位?)。编译器将始终使用两个或三个操作来加载/存储 24 位部分,因为它别无选择。
  • @jkj 正如我所说,很多位域机制是编译器定义的,但通常所有编译器都有类似的实现。这意味着这段代码很有可能会做你想做的事,如果是的话,它是定义良好的,你可以依赖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多