ads1248 的send data to the device. Data on DIN are shifted into the device on the falling edge of SCLK.。但是
Data are clocked out at
rising edge of SCLK, MSB first 。 输入数据是上升沿有效,输出数据确实下降沿有效。我对SPI进行配置是,应该怎样啊。求大神,好人一生平安。
Carter Liu:
上面两句的意思不是数据在SCLK下降沿从DIN引脚出来,数据在SCLK的上升沿输出么?请问有什么疑问吗
xuefeng Xiao:
回复 Carter Liu:
这2句话的理解没什么问题,主要是我要是想通过SPI的写的话,
CPOL: (Clock Polarity),时钟极性
当CPOL为0时,时钟空闲idle时候的电平是低电平;
当CPOL为1时,时钟空闲idle时候的电平是高电平;
CPHA:(Clock Phase),时钟相位
当CPHA为0时,时钟周期的前一边缘采集数据;
当CPHA为1时,时钟周期的后一边缘采集数据;又因为ads1248 读数据写数据 一个下降沿一个上升沿,,我应该怎么配置才好。麻烦您了
Carter Liu:
回复 xuefeng Xiao:
这个CPOL和CPHA是你的MCU的SPI模块的参数吧,不如你别使用这个模块了,使用软件模拟SPI就简单了,否则写入的时候要初始化SPI寄存器,读数据的时候要重新初始化SPI寄存器
若要使用MCU的SPI模块,时钟极性设置为0,即时钟空闲idle时候的电平是低电平,当CPHA为0时,时钟周期的前一边缘采集数据就是上升沿从ADS1248采集数据,这样就符合了ADS1248的数据输出规则
xuefeng Xiao:
回复 Carter Liu:
嗯嗯,这个问题我们清楚了,,还有一个问题 这个ads1248 当我AVDD和ASSS分别给5V和0V时,如果在给DVDD电压,这个芯片就工作不正常了,如果此时把DVDD悬空,数据就正常了。(ps 我3号脚CLK直接接地了)
Carter Liu:
回复 xuefeng Xiao:
那你得DGND接着地的吗?跟AVSS是同一个地吗?不正常工作是输出不正常的值还是就没有输出呢
xuefeng Xiao:
回复 Carter Liu:
还有一个问题,我AVDD接的5V,AVSS接的地,,REFP0接的2.048V,REFN0接地,我采负电压怎么出现问题了
Carter Liu:
回复 xuefeng Xiao:
你好,如果电源电压没有负电压,那么你的采集电压的范围是负电压的话就超出范围了吧?那是会出问题的
zhetao xu:
回复 Carter Liu:
Hi Carter,
我用9B92的SPI模块配置ADS1248一直读不出数据,麻烦您看一下。
voidAds1248Init(void){ GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6);//配置C4,C5,C6为输出 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6|GPIO_PIN_5,0x00);//对ADS1248复位 SysCtlDelay(4);//延时 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_6,GPIO_PIN_6);
while(SSIDataGetNonBlocking(SSI0_BASE, &UART_RX[0])) { }//如果SSI0正在接收数据等待 //对ADS1248进行配置 GPIOPinWrite(GPIO_PORTC_BASE,GPIO_PIN_5,GPIO_PIN_5); //START置1 SysCtlDelay(4);//延时 for(ulindex = 0; ulindex < 3; ulindex++) { // // 通过串口1显示打印发送的数据 // //while(UARTBusy(UART1_BASE)); //UARTCharPut(UART1_BASE,SSI_TX02[ulindex]);
//while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE, SSI_TX02[ulindex]);//spi配置ADS1248 02寄存器 选择REF0脚输入的外部参考电压 }
while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待
for(ulindex = 0; ulindex < 3; ulindex++) { // // 通过串口1显示打印发送的数据 // //while(UARTBusy(UART1_BASE)); //UARTCharPut(UART1_BASE,SSI_TX03[ulindex]);
//while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE, SSI_TX03[ulindex]);//spi配置ADS1248 03寄存器 PGA放大倍数为128 AD采样率为20HZ } while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待
for(ulindex = 0; ulindex < 3; ulindex++) { // // 通过串口1显示打印发送的数据 // //while(UARTBusy(UART1_BASE)); //UARTCharPut(UART1_BASE,SSI_TX0A[ulindex]);
//while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE, SSI_TX0A[ulindex]);//spi配置ADS1248 0A寄存器 电流源选择100UA }
while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 for(ulindex = 0; ulindex < 3; ulindex++) { // // 通过串口1显示打印发送的数据 // //while(UARTBusy(UART1_BASE)); //UARTCharPut(UART1_BASE,SSI_TX0B[ulindex]);
//while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE, SSI_TX0B[ulindex]);//spi配置ADS1248 0B寄存器 电流源1流过AIN0 ,电流源2流过AIN1 }
while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待
}
//读取环境温度doublePV_H(void){ double PVT1,PVT2,PVT3,PVT4,PVT5; double PVTD; int PVTC; while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 for(ulindex = 0; ulindex < 3; ulindex++) { // // 通过串口1显示打印发送的数据 // //while(UARTBusy(UART1_BASE)); //UARTCharPut(UART1_BASE,SSI_TX000[ulindex]);
//while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE, SSI_TX000[ulindex]);//spi配置ADS1248 00寄存器 正端选择AIN4 负端选择AIN5 }
while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 for(ulindex = 0; ulindex < 3; ulindex++) { // // 通过串口1显示打印发送的数据 // while(UARTBusy(UART1_BASE)); //UARTCharPut(UART1_BASE,SSI_TX00B[ulindex]);
// while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE, SSI_TX00B[ulindex]);//spi配置ADS1248 0B寄存器 电流源1流过AIN4 ,电流源2流过AIN5 }
while(SSIBusy(SSI0_BASE));//SSI0发送忙,等待 SSIDataPut(SSI0_BASE,RDATA);//spi读数据指令,每发送一个读一组数据
for(ulindex = 0; ulindex <3; ulindex++) { // // Receive the data using the "blocking" Get function. This function // will wait until there is data in the receive FIFO before returning. // SSIDataGet(SSI0_BASE, &UART_RX[ulindex]);
// // Since we are using 8-bit data, mask off the MSB. // UART_RX[ulindex] &= 0x00FF;
// // 通过串口显示SSI0接收到的数据 // while(UARTBusy(UART1_BASE)); UARTCharPut(UART1_BASE,UART_RX[ulindex]);
}