This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5529:从 ADS1118读取

Guru**** 2563960 points
Other Parts Discussed in Thread: MSP430F5529, ADS1118

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/725664/msp430f5529-reading-from-ads1118

器件型号:MSP430F5529
主题中讨论的其他器件: ADS1118

您好!

我使用 MSP430F5529通过 SPI 与三个 ADS1118通信。  我无法读取 ADS1118的输出、因为其 SPI 协议与标准 SPI 协议稍有不同。  我的 MSP430代码(随附)仅读取 MSB、并且无法读取 LSB ADS1118输出代码。  请提供任何帮助。

我要连接 ADS1118的 SPI 协议。  MSP430 (主器件)正在向 ADS1118 (从器件)写入0x8F (MSB)和0xEB (LSB)。  我可以对 SPI 协议进行范围检查并确认这是正确的。   

我还将附加我的 MSP430 SPI 代码。

Thanks.e2e.ti.com/.../ADS1118_5F00_SPI_5F00_MSP430FF529_5F00_Code.txt

//
//
//说明:SPI 主控(MSP430F5529)与3个 ADS1118从器
件通信//
MSP430F5529
// --------
// | (请参阅下面的)|->从器件芯片选择(GPIO)
// | |
// | |
// | |
// | P3.3|->数据输出(UCA0SIMO/DIN)
// | |
// | P3.4|<-数据输入(UCA0SOMI/DOUT)
// | |
// | P2.7|->串行时钟输出(UCA0CLK)
// | |
// | |///CSB_ADC1

= P1.2;CSB_ADC2 = P1.3;CSB_ADC3 = P1.4
//

////////*********

#include 
#include 
#include 

#define dummy 0x00

#define CSB_M1_OUT P1OUT
#define CSB_M1_DIR P1DIR
#define CSB_M1_PIN BIT2

#define CSB_M2_OUT P1OUT
#define CSB_M2_DIR P1DIR
#define CSB_M2_PIN BIT3

#define CSB_M3_OUT P1OUT P1OUT #define CSB_M2_DIR #define CSB_P1DIR #define
P1DIR #define CSB_M2_P1DIR #define P1DIR #define BIT3


1
#define length_two 2
#define length_Six 6

#define MAX_BUFFER_SIZE 20

#define ADS1118_REG_ADDR_CONFIG_REG_MSB_def 0x8F //1000_1110
//8:MODE = 0用于连续转换模式;1 =断电模式
// 11:9:FSR =+/-0.256V
// 14:12:AIN0 =(+15 =
1)时 Ve = 111;单次转换=+/-0.256V // 14:12:Ux = 000用于 Ave (+15 = 1) 1 =启动单次转换

typedef 枚举 SPI_ModeEnum{
IDLE_MODE、
TX_REG_ADDRESS_MODE、
RX_REG_ADDRESS_MODE、
TX_DATA_MODE、
RX_DATA_MODE、
WRITE_READ_MODE、
timeout_mode
}SPI_Mode;


uint8_t ADS1118_REG_ADDR_CONFIG_REG_LSB[length_One]={0xEB};//1110_1010
// 0:保留
//2:1:NOOP = 01 (有效数据)
/3:上拉 EN =当/CSB 为高电平时、这将使
ADC 缓冲区上升到


6个引脚(dtruTS_8)(dr)= 1:t8:0[t_dsps (uTS_dr)
SPI_Mode MasterMode = IDLE_MODE;

uint8_t TransmitRegAddr = 0;
uint8_t TransmitDataMSB = 0;
uint8_t TransmitDataLSB = 0;
uint8_t ReceiveBuffer[MAX_buffer_SIZE]={0};
uint8_t TransmitBuffer = 0;uint8_t =

uint8_t


= uint8;uint8 = uintsensor_t Index = uint8;uint8 uint8 uint_t TransmitTransmittransaccum_t = 0;uint_t = uint_t


int mymode = 0;
uint8_t MyData = 0;

void SendUCA0Data (uint8_t val);

//*********
// CopyArray ********
//
void CopyArray (uint8_t *源、uint8_t *目的、uint8_t 计数);
void CopyArray (uint8_t *源、uint8_t *目的、 uint8_t count)
{
uint8_t copyIndex = 0;
for (copyIndex = 0;copyIndex < count;copyIndex++)
{
dest[copyIndex]= source[copyIndex];
}
}

//*********
//主设备写入从设备*********
//
SPI_Mode SPI_Master_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count、int senNum、int mode);
SPI_Mode SPI_Master_WriteReg (uint8_t reg_addr、uint8_t * reg_data、uint8_t count、int senNum、int mode)
{

sensor_number = senNum;
MasterMode = TX_REG_ADDRESS_MODE;
TransmitRegAddr = reg_addr;

//将寄存器数据复制到 TransmitBuffer
CopyArray (reg_data、TransmitBuffer、count);

TXByteCtr =计数;
RXByteCtr = 0;
ReceiveIndex = 0;
TransmitIndex = 0;
mymode =模式;

if (sensor_number = 6){
CSB_M1_OUT &=~(CSB_M1_PIN);
}

否则、如果(sensor_number = 7){
CSB_M2_OUT &=~(CSB_M2_PIN);
}

否则、如果(sensor_number = 8){
CSB_M3_OUT 和=~(CSB_M3_PIN);
}

SendUCA0Data (TransmitRegAddr);

_bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0

if (sensor_number = 6){
CSB_M1_OUT |= CSB_M1_PIN;
}

否则、如果(sensor_number = 7){
CSB_M2_OUT |= CSB_M2_PIN;
}

否则、如果(sensor_number = 8){
CSB_M3_OUT |= CSB_M3_PIN;
}

返回主模式;
}

//*********
//主从从从器件读取********
//
SPI_Mode SPI_Master_ReadReg (uint8_t reg_addr、uint8_t count、int senNum);
SPI_Mode SPI_Master_ReadReg (uint8_t reg_addr、uint8_t count、 int senNum)
{
sensor_number = senNum;
MasterMode = TX_REG_ADDRESS_MODE;
TransmitRegAddr = reg_addr;
RXByteCtr =计数;
TXByteCtr = 0;
ReceiveIndex = 0;
TransmitIndex = 0;

if (sensor_number = 6){
CSB_M1_OUT &=~(CSB_M1_PIN);
}

否则、如果(sensor_number = 7){
CSB_M2_OUT &=~(CSB_M2_PIN);
}

否则、如果(sensor_number = 8){
CSB_M3_OUT 和=~(CSB_M3_PIN);
}

_bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0

if (sensor_number = 6){
CSB_M1_OUT |= CSB_M1_PIN;
}

否则、如果(sensor_number = 7){
CSB_M2_OUT |= CSB_M2_PIN;
}

否则、如果(sensor_number = 8){
CSB_M3_OUT |= CSB_M3_PIN;
}

返回主模式;
}

//*********
//发送数据*********
//

void SendUCA0Data (uint8_t val)
{

while (!(UCA0IFG & UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
UCA0TXBUF = val;

}

//
//将时钟设置为16MHz*
//*********

void initClockTo16MHz()
{
UCSCTL3 |= SELREF_2; //设置 DCO FLL 基准= REFO
UCSCTL4 |= SE拉美 经济体系2; //设置 ACLK = REFO
_bis_SR_register (SCG0); //禁用 FLL 控制环路
UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx
UCSCTL1 = DCORSEL_5; //选择 DCO 范围16MHz 操作
UCSCTL2 = FLLD_0 + 487; //将 DCO 乘法器设置为16MHz
//(N + 1)* FLLRef = Fdco
//(487 + 1)* 32768 = 16MHz
//设置 FLL Div = fDCOCLK
_BIC_SR_register (SCG0); //启用 FLL 控制环路

// DCO 范围位已经存在时、DCO 的最坏情况稳定时间
//已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
// UG 进行优化。
// 32 x 32 x 16 MHz/32、768Hz = 500000 = DCO 稳定的 MCLK 周期
_DELAY_CYCLES (50000);//
//循环直到 XT1、XT2和 DCO 故障标志被清除
操作
{
UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + DCOFFG);//清除 XT2、XT1、DCO 故障标志
SFRIFG1 &=~OFIFG; //清除故障标志
} while (SFRIFG1&OFIFG); //测试振荡器故障标志
}

//*********
//初始化 GPIO
//*********
void initGPIO ()
{
//以下是 CSB 的 GPIO:
//CSB_A1 = P2.0;CSB_A2 = P2.2;CSB_A3 = P2.4;CSB_A4 = P2.5;CSB_A5 = P1.5
// CSB_M1 = P1.2;CSB_M2 = P1.3;CSB_M3 = P4DIR

= P7
~

;PIT7 + PIT7 | PIT7 = P4DIR = P7;BITR= P7 + P4DIR
// P3.3 = SIMO;P3.4 = SOMI
P2SEL |= BIT7; // P2.7 = SCLK

//UART
P4SEL |= BIT4 + BIT5; // P4.4 = UART TXD;P4.5 = UART RXD
/*
//用于启动传输
的按钮 P2DIR &=~BIT6; //将 P2.1设定为输入方向
P2REN |= BIT6; //启用 P2.1内部电阻
P2OUT |= BIT6; //将 P2.1设置为上拉电阻
P2IES |= BIT6; // P2.1高/低边沿
P2IFG &=~BIT6; // P2.1 IFG 清除
P2IE |= BIT6; // P2.1中断已启用
*/
}//

*********
//初始化 SPI
//*********
void initSPI (int sensorno)
{
UCA0CTL0 &= 0; //清除该寄存器
UCA0CTL1 |= UCSWRST; //**将状态机置于重置中**

UCA0CTL0 |= UCMSB + UCMST + UCSYNC;
/*UCCKPH =时钟相位选择= 0、根据 ADS1118 SPI 时序图
根据 ADS1118 SPI 时序图、UCCKPL =时钟极性选择= 0
UCMSB = MSB 优先
UCMST = MSP430F5528是主器件、MC3672和 ADS1118 =从器件
UCSYNC =同步*/


UCA0CTL1 |= UCSSEL_2; //时钟= SMCLK
UCA0BR0 |= 0x20; //比特率
UCA0BR1 = 0; //
UCA0MCTL = 0; //对于 SPI
UCA0CTL1 &=~UCSWRST、必须清除调制; //**初始化 USCI 状态机**
UCA0IE |= UCRXIE; //启用 USCI0 RX 中断


CSB_M1_DIR |= CSB_M1_PIN;
CSB_M1_OUT |= CSB_M1_PIN;

CSB_M2_DIR |= CSB_M2_PIN;
CSB_M2_OUT |= CSB_M2_PIN;

CSB_M3_DIR |= CSB_M3_PIN;
CSB_M3_OUT |= CSB_M3_PIN;

}


//*********
//主要内容
//发送和接收三条包含示例命令*******的消息
//
int main (void){

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
initClockTo16MHz();
initGPIO();

while (1)
{

initSPI (1);//初始化 ADS1118的 SPI
SPI_Master_WriteReg (ADS1118_REG_ADDR_CONFIG_REG_MSB_def、ADS1118_REG_ADDR_CONFIG_REG_LSB、length_one、6、1); //写入和读取 ADS1118

}//end while

}//end main


//*********
// SPI 中断
//

#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
#Elif defined (__GNU__)
void __attribute__(interrupt (USCI_A1_vector))#USCI_A0

Compiler #a0_aid!
#endif
{
uint8_t uca0_Rx_val = 0;

switch (__evo_in_range (UCA0IV、4))
{
情况0:中断; //向量0 -无中断
案例2: //向量2 - RXIFG

UCA0_Rx_val = UCA0RXBUF;

开关(主模式)
{
//---Always starts with this --(始终从这开始--)
案例 TX_REG_ADDRESS_MODE:
IF (RXByteCtr) //如果从从器件读取主器件
{
MasterMode = RX_DATA_MODE;//需要立即开始接收
//发送虚拟到开始
_DELAY_CYCLES (75);
SendUCA0Data (虚拟);
}
否则(TXByteCtr) //如果主器件写入从器件
{
MasterMode = TX_DATA_MODE; //首先发送寄存器地址
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
}
中断;

案例 TX_DATA_MODE: //如果主器件写入从器件
IF (TXByteCtr) //发送数据
{
SendUCA0Data (TransmitBuffer[TransmitIndex++]);
TXByteCtr --;
}
其他
{
如果(mymode=1){
UCA0_Rx_val = UCA0RXBUF;
ReceiveBuffer[0]= uca0_Rx_val;
UCA0_Rx_val = UCA0RXBUF;
ReceiveBuffer[1]= uca0_Rx_val;
UCA0_Rx_val = UCA0RXBUF;
ReceiveBuffer[2]= uca0_Rx_val;
}
//传输完成
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}
中断;

RX_DATA_MODE case: //如果从从器件读取主器件
IF (RXByteCtr)
{
ReceiveBuffer[ReceiveIndex++]= uca0_Rx_val;//从从器件读取数据
//发送虚拟
RXByteCtr --;
}
IF (RXByteCtr = 0)
{
MasterMode = IDLE_MODE;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0
}
其他
{
SendUCA0Data (虚拟);
}
中断;

默认值:
__no_operation();
中断;
}
__DELAY_CYCLES (1);//100是主控方写入之间的~20us 间隔
中断;
案例4:中断; //向量4 - TXIFG
默认值:中断;
}
} 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Amy、

    到目前为止、有两件事在我身上跳出来。

    首先,您似乎没有在 initClockTo16MHz()函数中使用建议的 DriverLib 代码来正确地增加16MHz 操作的 VCORE。

    其次、我不建议将您的 SPI 配置代码放入无限 while (1)函数中。 它可能只需要执行一次。 如果只执行以下两个函数一次、会发生什么情况? 通信是否正确发生?

    initSPI (1);//初始化 ADS1118的 SPI
    SPI_Master_WriteReg (ADS1118_REG_ADDR_CONFIG_REG_MSB_def、ADS1118_REG_ADDR_CONFIG_REG_LSB、length_one、6、1); //写入和读取 ADS1118 

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是对的、对于此代码、我可以将 intSPI (1)放在 while (1)循环之外。 但是、在我的总体代码中、我实际上是在与其他传感器通信(我没有在代码中显示它)、而其他传感器的时钟极性不同于 ADS1118的时钟极性、因此我每次与 ADS1118通信时都需要更改该极性。

    无论如何、如果我只执行两个函数一次、那么不执行、我仍然无法读取 ADS1118输出代码的 LSB。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要确保 SMCLK 完全符合您的预期、因此请仔细检查 VCORE 设置是否正确。

    此外、您是否还遵循了具有 内部参考的超小型、低功耗、SPI 兼容、16位 ADC 和温度传感器数据表中图49中提供的伪代码流程? 如果您的 CPU 以与预期不同的频率运行、并且您的延迟与建议的频率不匹配、这可能是您的通信无法正常工作的原因。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 James:

    是的、我对照伪代码流进行了检查、一切看起来都很好。 我可以使用示波器看到 SPI 通信、因此我可以检查时序、但我的代码无法从 ADS1118捕获 LSB 数据。

    还添加了代码以正确设置 VCORE。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SPI 事务是一个 Exchange --为了得到一个字节,你需要发送一个字节。 因此、

    > 如果(mymode=1){
    > UCA0_Rx_val = UCA0RXBUF;
    > ReceiveBuffer[0]= uca0_Rx_val;
    > UCA0_Rx_val = UCA0RXBUF;
    > ReceiveBuffer[1]= uca0_Rx_val;
    > UCA0_Rx_val = UCA0RXBUF;
    > ReceiveBuffer[2]= uca0_Rx_val;
    >}
    这将读取重复的字节、因为您不会在两者之间发送任何内容。

    是否有理由不能只使用 ReadReg? 似乎所有基础设施都在那里。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我明白了。  因此、MSP430似乎需要写入配置 MSB 和读取数据 MSB、然后写入配置 LSB 和读取数据 LSB。

    到目前为止、我一直在做- MSP430写入配置 MSB 和配置 LSB、然后读取数据 MSB 和数据 LSB、但失败了。   

    我会尝试一下您的建议。 谢谢。  

     HMM、  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、

    好的、MSP430发送了配置 MSB (0x8F)、它能够从 ADS1118读取正确的数据 MSB。  然后 MSP430发送配置 LSB (0xEB)、但它仍然无法从 ADS1118读取数据 LSB。  附加的代码。  

    如果我要发送第二个字节、我如何才能不返回第二个字节? 对 SPI 进行范围界定表明 MSP430正在写入正确的值、ADS1118正在报告正确的值、时序看起来不错。  

    谢谢。  

    e2e.ti.com/.../ADS1118_5F00_SPI_5F00_MSP430FF529_5F00_Code_5F00_v2.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在这里看不到任何明显的逻辑缺陷。

    "无法读取"到底意味着什么? 程序是否不请求(Tx)第二个字节、或者产生的(Rx)第二个字节不正确? UART 报告什么?

    > UCA0CTL0 = 0x29;//0010_1001 = UCMSB + UCMST + UCSYNC;更改 ADS1118时钟极性
    UCCKPL 被标记为需要更改复位(UCSWRST 序列)的字段、因此我怀疑这种更改不会发生。 示波器上的时钟极性是什么样子的?

    此外、"mymode"应声明为"volatile"。 即使现在不会引起问题、也会最终导致问题。

    我要做的下一件事是在此行上放置一个断点:
    > ReceiveBuffer[1]= uca0_Rx_val;
    并查看(1)它是否到达那里(2) uca0_rx_val 是什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    >>"无法读取"意味着 UCA0RXBUF__SPI 无法读取 ADS1118的 LSB。  

    我将附加 ADS1118 SPI 图、并且尽可能地将 ADS1118数据 MSB = 0x02且数据 LSB = 0xC8。  如果我运行代码、 UCA0RXBUF__SPI 会持续报告0x02 (MSB);它永远不会读取0xC8 (LSB)。

    我的 ReceiveBuffer[0]= 0x02、ReceiveBuffer[1]= 0x02。

    >>我还在附上 ADS1118时钟极性的图片、我认为这很好。  如果这是错误的、ADS1118本不会报告正确的输出代码。  

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好奇。 结合时钟极性、这种行为与您的第一个代码比第二个代码更加一致。

    当您达到我建议的断点时、您会看到什么? (此时 ReceiveBuffer[1]应为0。)

    UART 输出是什么意思?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    好的、这很奇怪。  当我在 ReceiveBuffer[1]处放置一个断点时、我可以看到正确的 ADS1118 MSB+LSB、而 ReceiveBuffer 报告为0x02和0xC8。

    但是、当我在 ReceiveBuffer[0]和 ReceiveBuffer[1]处放置一个断点并继续按 F5时、ReceiveBuffer 包含0x02和0x02。  

    如果我只是让代码自由运行并使用 Putty 来探测 UART、那么很难对 ASCII 代码进行解密。  我无法看到正在发出什么代码、但似乎只有一个字节会发出(随附 Putty UART 通信图片)。 注意:"x"只是0x58、我用于指示我要与哪个传感器通信)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将"v2"代码放在 F5529 Launchpad 上、并将 P3.3跳线到 P3.4 (SIMO 转 SOMI)、从而创建环回。

    当我经常运行它并暂停时、我始终会在 ReceiveBuffer 中看到[0x8F、0xEB、0x00]、这正是我所期望的。 (有时我会看到全0、这意味着我恰好在"Send_UART"清除它之后捕获它。)

    我不确定你和我的表现有何不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我重复您的实验、得到的结果与您相同。   

    但是、如果我将 SIMO 和 SOMI 连接到 ADS1118、那么我似乎无法读取 ADS1118 LSB 数据。  这是我应该询问 ADS1118团队的吗?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试连接一个"回波服务器"SPI 从器件(源自其中一个 TI 示例)、并且获得相同(正确)的结果。

    我完全不清楚 ADS1118如何导致您描述的症状、尤其是使用示波器跟踪。 但也是因为我没有你的设备、所以我没有尝试过很多东西。

    也许(正如您所说的) ADS1118人会识别出某种东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Amy、


    只是为了让我理解、ADS1118是否以适当的输出进行响应? 从示波器图中可以看出、ADS1118提供了正确的 DOUT (MISO)响应。 读回看起来像0x02 0xC8。 在示波器上、您从 MSP430获取的读回是否看起来像0x02 0x02?

    唯一可能会使 DOUT 复位的是转换未与通信同步。 例如、如果您处于读取数据的中间位置、则新的转换完成。 然后 DOUT 将更新为新的转换结果。 这将导致读数重新开始。 在大多数情况下、我们建议在单次转换模式下运行器件、然后让主器件等待整个数据周期加上10%的时钟变化。 例如、如果器件设置为128SPS、则需要等待大约8.6ms 才能读取器件。

    如果您在连续转换模式下运行、则需要确保在 DOUT/DRDY 转换为低电平时开始读取数据。 如果只通过轮询来实现、那么在读取期间可能会出现新的转换数据、这可能会导致读取 SPI 数据时出现问题。

    但是、如果 ADS1118 DOUT 在示波器上始终看起来正常、但您仍会从 MSP430中收到读取错误、我怀疑问题出在 MSP430或代码上。


    吴约瑟
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Amy、

    根据对所发生情况的描述、我会考虑是否存在与时间相关的错误。 程序流的执行实际上可能比发送 TX 缓冲区内容所需的时间快。 如果中断服务例程的延迟序列比发送时间小得多、则情况尤其如此。

    由于您的读取例程与中断状态机无关、因此在状态机变为空闲状态之前、您很可能已经进入 UART 传输序列。 错误的时序很可能是您在使用断点时能够看到正确数据的原因。

    此致、
    Bob B