ADS1118 通道不对了?
主控芯片MSP430F6638,ADC芯片是ADS1118,现在发现只读取某一个通道的电压值是对的,如果在程序中读取多路电压的话,会出现通道错位的现象,CPU在1M的时候,通道0的数据跑到了通道1上,1到2上,2到3上,3到0上,4M的时候0上的电压到通道2,3上,2上的数据到通道0,1上。程序如下:
void __DELAY(u32 n)
{
u32 m=4*n;
while(m--);
};
void SPIA1_Init(void)
{
P8SEL |= BIT1+BIT2+BIT3; // Assign P8.1 to UCB0CLK and...
P8DIR |= BIT0+BIT1+BIT2; // P8.3 UCB0SOMI P8.2 UCB0SIMO
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL0 |= UCMST+UCSYNC+UCMSB; // 3-pin, 8-bit SPI master
// Clock polarity high, MSB
UCA1CTL1 |= UCSSEL__SMCLK; // SMCLK
UCA1BR0 = 106;
UCA1BR1 = 0; //
UCA1MCTL = 0; // No modulation
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
// UCA1IE = UCRXIE+ UCTXIE; // Enable USCI_A0 RX,TX interrupt
}
/*MODE 0: Only write config regist to ADS1118
MODE 1: Write config regist to ADS1118 as well as read data from ADS1118
*/
int ADS1118_WriteSPI(u32 config,u8 mode)
{
u32 temp;
temp=config;
if(mode==1)
temp=config|0x8000;
int msb;
//while(UCA1STAT&UCBUSY);
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF = (temp>>8);
__DELAY(100);
//while(UCA1STAT&UCBUSY);
while (!(UCA1IFG&UCRXIFG));
msb = UCA1RXBUF;
while (!(UCA1IFG&UCTXIFG));
//while(UCA1STAT&UCBUSY);
UCA1TXBUF = (temp & 0xff);
__DELAY(100);
while (!(UCA1IFG&UCRXIFG));
//while(UCA1STAT&UCBUSY);
msb = (msb<<8) | UCA1RXBUF;
return msb;
}
void ADS1118_Config(u32 temp_congfig_value)
{
u32 config_value=temp_congfig_value;
CLR_AD_CS; //set CS low
__DELAY(100); //Wait for slave to initialize
ADS1118_WriteSPI(config_value,0); //Write configuration to ADS1118
__DELAY(100);
SET_AD_CS;
}
int ADS1118_Read(u32 temp_config_value)
{
int DATA;
u32 config_value=temp_config_value;
CLR_AD_CS;
__DELAY(100);
DATA = ADS1118_WriteSPI(config_value,1);
__DELAY(100);
SET_AD_CS;
return DATA;
}
int ADS1118(u32 temp_congfig_value)
{
u32 config_value=temp_congfig_value;
int result;
SET_AD_CS;
ADS1118_Config(config_value);
__DELAY(1000);
result = ADS1118_Read(config_value);
return result;
}
int GetADC_0(void)
{
//return ADS1118(0x458B);
return ADS1118(0xC58B);
}
int GetADC_1(void)
{
//return ADS1118(0x558B);
return ADS1118(0xD58B);
}
int GetADC_2(void)
{
//return ADS1118(0x658B);
return ADS1118(0xE58B);
}
int GetADC_3(void)
{
//return ADS1118(0x758B);
return ADS1118(0xF58B);
}
建议转到MCU论坛,以便代码得到进一步的分析。硬件问题的话,建议先从一个通道调试,得到正确的结果后,再对第二个通道,然后只正对第一第二通道进行调试。