【发布时间】:2015-11-03 21:54:21
【问题描述】:
我正在尝试使用 SPI 通信读取 ADC(ADS8320) 值。我正在为 ARM 和 SM470R1B1 控制器使用 IAR 嵌入式工作台。在数据表中,它说前 6 位是虚拟读取,接下来的 16 位是 actval 数据。我正在尝试读取 24 位并忽略前 6 位和后 2 位。当我尝试使用以下代码时,我得到了错误的值。
unsigned int readADC8320(void)
{
value = AD8320_16(0xFFFFFF); // read registe
return value;
}
unsigned int AD8320_16(unsigned int value)
{
unsigned int data;
AD8320_CS_Status(0);
SW_Delay(DELAY_10US);
while(GIODOUTA&X2);
data = spi2(value >> 16); //read high 8 bits
data = (data << 6)| spi2(value >> 8); //read next 8 bits but 6+8 =14
data = (data << 8)| spi2(value >> 2); //add last two bits only
SW_Delay(DELAY_10US);
AD8320_CS_Status(1);
return data;
}
unsigned char spi2(unsigned char data)
{
// Write byte to SPI2DAT1 register
SPI2DAT1 = data;
while(!(SPI2CTRL3 & 0x01)){} // Wait for RxFlag to get set
return (SPI2BUF & 0x000000FF); // Read SPIBUF
}
谁能建议我哪里做错了。我的班次操作很差。
【问题讨论】:
-
从描述您的系统开始。我们甚至不知道您使用的 CPU/MCU 是什么。
-
你可能不擅长轮班操作,但你很不擅长提出问题,大概是测试和调试。当您使用调试器单步执行此代码时,作为“值”传递了什么以及如何将数据处理为“数据”?
-
我的意思是,为什么只是将这些硬件驱动程序的东西转储给我们作为代码转储?我们不知道“价值”是理智的、颠倒的、正确的端序还是什么。据我们所知,您的 ADC 甚至没有通电,而您正在处理垃圾。
-
unsigned int是 16 位还是 32 位?
标签: c embedded bit-shift spi adc