主控制是带四线制SPI接口的微处理器,设置为24位模式(16位模式也试过,现象是一样的),时钟信号12MHz,CLCK时钟滞后CS片选信号1.5us,读写SFR均正常。采样模式设置为单次采样,12CLCK转换时间,内部基准源。读取通道11、12、13测试通道的数据都是一样的,应该是没有实现数据转换。
Hawk Tong:
1. 是否监测采样时中断信号EOC的输出波形?
2. 设计上如何处理CSTART管脚 ?对应的控制信号
3. 方便时,将你处上传你的代码看看
liang hu30:
回复 Hawk Tong:
CSTART和FS管脚都没用,直接通过电阻拉高,测试时采用延时测试,没有检测EOC引脚状态。下面是测试代码:
static int adc_init(void);
static int adc_write_data(unsigned int cmd);
static int adc_get_data(unsigned int cmd);
static int adc_get_analog(unsigned int cmd);
static int adc_get_sfr(void);
ADCSPI_T adc = {
.value = 0.0,
.tdata = 0,
.sfr_data = 0,
.init = adc_init,
.get_data = adc_get_data,
.get_analog = adc_get_analog,
.get_sfr = adc_get_sfr
};
static int adc_init(void)
{
PIO_ADC_CS->DATA.BITS.CS = 1;//这是后来将SPI数据位改成8位模式,并将CS引脚用IO脚模拟
adc_write_data(0xa000);
adc_write_data(0xa804);
return 0;
}
static int adc_write_data(unsigned int cmd)
{
/************16和24模式****************
// unsigned int cmd_temp;//
// cmd_temp = cmd<<8;
*/
unsigned char cmd_h,cmd_l;
cmd_l = cmd;
cmd_h = cmd>>8;
PIO_ADC_CS->DATA.BITS.CS = 0;
usleep(2);
ADC_SPI->TXDATA = cmd_h;//cmd_temp;
while(!(ADC_SPI->STATUS.BITS.TMT));
ADC_SPI->TXDATA = cmd_l;//cmd_temp;
while(!(ADC_SPI->STATUS.BITS.TMT));
usleep(5);
PIO_ADC_CS->DATA.BITS.CS = 1;
return 0;
}
static int adc_get_sfr(void)
{
int ttdata;
/************16和24模式****************
// adc_write_data(0x9000);
// ttdata = ADC_SPI->RXDATA >>8;
// adc.sfr_data = ttdata & 0x0fff;
*/
PIO_ADC_CS->DATA.BITS.CS = 0;
usleep(2);
ADC_SPI->TXDATA = 0x90;//cmd_temp;
while(!(ADC_SPI->STATUS.BITS.TMT));
ttdata = ADC_SPI->RXDATA;
ttdata = ttdata << 8;
ADC_SPI->TXDATA = 0x00;//cmd_temp;
while(!(ADC_SPI->STATUS.BITS.TMT));
ttdata = ttdata + ADC_SPI->RXDATA;
usleep(5);
PIO_ADC_CS->DATA.BITS.CS = 1;
adc.sfr_data = ttdata & 0x0fff;
return 1;
}
static int adc_get_data(unsigned int cmd)
{
int data;
unsigned char cmd_h,cmd_l;
/************16和24模式****************
// adc_write_data(cmd);
// data = ADC_SPI->RXDATA;
// usleep(500);
// while(PIO_ADC_ECO->DATA.BITS.ECO == 0);
// adc_write_data(cmd);
// data = ADC_SPI->RXDATA;
*/
PIO_ADC_CS->DATA.BITS.CS = 0;
usleep(2);
ADC_SPI->TXDATA = cmd_h;//cmd_temp;
while(!(ADC_SPI->STATUS.BITS.TMT));
data = ADC_SPI->RXDATA;
data = data << 8;
ADC_SPI->TXDATA = cmd_l;//cmd_temp;
while(!(ADC_SPI->STATUS.BITS.TMT));
data = data + ADC_SPI->RXDATA;
usleep(5);
PIO_ADC_CS->DATA.BITS.CS = 1;
data = data >>12;
return data;
}
static int adc_get_analog(unsigned int chn)
{
int ddata;
// float value;
ddata = adc_get_data(chn);
adc.tdata = ddata;
adc.value = ddata * MOD;// + OFFSET;
// dac_set_data(chn,ddata);
return 1;
}
liang hu30:
回复 liang hu30:
主程序0.5s读一次采样数据。时间上肯定能转换完成,准备延时采样测试成功再通过检测EOC采样。