打印
[STM32F4]

AD7190的问题

[复制链接]
1515|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我捣鼓AD7190,数据可以读出来,可是有时出错。
大部分数值都对,偶尔差别很大。
程序是另一个人写的,他说他用的好着呢。
我查程序,发现ID寄存器的识别码读的都有问题。

regVal是0xffffffff,手册上说是4.
搞不懂。
大神指点。谢谢!
附程序:
USER.rar (7.19 KB)

使用特权

评论回复
沙发
kingkits| | 2020-1-2 16:30 | 只看该作者
本帖最后由 kingkits 于 2020-1-2 16:33 编辑

貌似SPI通讯需要使能CS,从代码里粗粗看一下,没看到显式的操作(也不排除在别的地方自动操作了)。不过,代码比较难看懂。
你要是能独立操作 CS,可以考虑加上CS,并延时一小段时间后,再做 读取ID的操作。从数据上看是ADC芯片没有工作,你也可以用示波器看看控制逻辑是不是符合ADC芯片的要求

使用特权

评论回复
板凳
Cjy_JDxy|  楼主 | 2020-1-2 16:45 | 只看该作者
kingkits 发表于 2020-1-2 16:30
貌似SPI通讯需要使能CS,从代码里粗粗看一下,没看到显式的操作(也不排除在别的地方自动操作了)。不过, ...

谢谢!
有CS拉低的操作,一直就没有拉高。

不好测,示波器只有两个通道。

使用特权

评论回复
地板
tiantiantian123| | 2020-1-2 16:57 | 只看该作者
硬件上的问题面很大,芯片滤波加一些,spi速度降低一些,再试

使用特权

评论回复
5
kingkits| | 2020-1-2 17:26 | 只看该作者
Cjy_JDxy 发表于 2020-1-2 16:45
谢谢!
有CS拉低的操作,一直就没有拉高。

可以考虑只看CS和CLK信号,按说操作完就应该CS拉高!

使用特权

评论回复
6
Cjy_JDxy|  楼主 | 2020-1-2 17:44 | 只看该作者
kingkits 发表于 2020-1-2 17:26
可以考虑只看CS和CLK信号,按说操作完就应该CS拉高!

不拉高行吗?程序里没有拉高的操作。

使用特权

评论回复
7
kingkits| | 2020-1-3 08:48 | 只看该作者
本帖最后由 kingkits 于 2020-1-3 08:53 编辑
Cjy_JDxy 发表于 2020-1-2 17:44
不拉高行吗?程序里没有拉高的操作。

没仔细看过Datasheet, 正常的操作都是完成操作后要上拉的,但没看到哪里说不上拉就一定不行。
我建议是最好有上拉操作:
另外: 貌似ADC de ID 码长度为2字节

ad7920_generic.zip

6.46 KB

使用特权

评论回复
8
Cjy_JDxy|  楼主 | 2020-1-3 09:03 | 只看该作者
kingkits 发表于 2020-1-3 08:48
没仔细看过Datasheet, 正常的操作都是完成操作后要上拉的,但没看到哪里说不上拉就一定不行。
我建议是最 ...

谢谢!要是两个字节就对了。

使用特权

评论回复
9
kingkits| | 2020-1-3 09:09 | 只看该作者
Cjy_JDxy 发表于 2020-1-3 09:03
谢谢!要是两个字节就对了。

稍微看了一下,CS拉低时才能启动一次ADC转换。
如果需要再次转换,还需要Cs拉高后再次拉低才能启动。

使用特权

评论回复
10
Cjy_JDxy|  楼主 | 2020-1-3 09:15 | 只看该作者
kingkits 发表于 2020-1-3 09:09
稍微看了一下,CS拉低时才能启动一次ADC转换。
如果需要再次转换,还需要Cs拉高后再次拉低才能启动。 ...

谢谢!哪儿有这个说明,能具体说一下吗?

使用特权

评论回复
11
kingkits| | 2020-1-3 09:28 | 只看该作者
本帖最后由 kingkits 于 2020-1-3 09:40 编辑
Cjy_JDxy 发表于 2020-1-3 09:15
谢谢!哪儿有这个说明,能具体说一下吗?

看错了,你等一下




使用特权

评论回复
12
ayb_ice| | 2020-1-3 09:42 | 只看该作者
SPI,IIC我从不用硬件操作,直接GPIO模拟,速度也快,好移植,可靠性高

使用特权

评论回复
13
kingkits| | 2020-1-3 09:44 | 只看该作者
我这里没仔细看,你那个芯片是7190,我看成是7910
应该是32为ID号码,别误导你
另外:CS也不是启动ADC的必须步骤。
非常抱歉

使用特权

评论回复
14
kingkits| | 2020-1-3 09:53 | 只看该作者



使用特权

评论回复
15
kingkits| | 2020-1-3 10:10 | 只看该作者
给个简单的代码仅供参考;

struct
{
u8 AD7190_SendData[4];
u8 AD71901_ReveiceData[4];
}AD7190_TempData;
void SPI1_Send_ReveiceFull(u8 * data,u8 len)
{
u8 temp,i;
  
// CS_ON1();
for(i = 0;i < len;i++)
{
  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
  SPI_I2S_SendData(SPI1,*(data + i));
  while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
  temp = SPI_I2S_ReceiveData(SPI1);
  *(AD7190_TempData.AD71901_ReveiceData + len - i - 1 ) = temp;
}
// CS_OFF1();
}
//AD7190芯片初始化(仅供参考)
void AD71901Init(void)
{
u8 i;
for(i = 0 ;i < 4;i ++)
{
  AD7190_TempData.AD7190_SendData[i] = 0xff;
}
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,4);
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
for(i = 0 ;i < 4;i ++)
{
  AD7190_TempData.AD7190_SendData[i] = 0x00;
}
delay_us(700);


//读模式寄存器
AD7190_TempData.AD7190_SendData[0] = 0x48;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
for(i = 0 ;i < 4;i ++)
{
  AD7190_TempData.AD7190_SendData[i] = 0x00;
}
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
// printf("AD71901数据:%x_%x_%x\r\n",AD7190_TempData.AD71901_ReveiceData[3] +  buf[2],buf[1],buf[0]);
//读配置寄存器
AD7190_TempData.AD7190_SendData[0] = 0x50;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
for(i = 0 ;i < 4;i ++)
{
AD7190_TempData.AD7190_SendData[i] = 0x00;
}
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
// printf("AD7190数据1:%x_%x_%x\r\n",buf[2],buf[1],buf[0]);

AD7190_TempData.AD7190_SendData[0] = 0x10;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
// SPI2_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
AD7190_TempData.AD7190_SendData[0] = 0;
AD7190_TempData.AD7190_SendData[1] = 0x03;
AD7190_TempData.AD7190_SendData[2] = 0;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
// SPI2_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
//设置模式寄存器
AD7190_TempData.AD7190_SendData[0] = 0x08;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
// SPI2_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
AD7190_TempData.AD7190_SendData[0] = 0x18;
AD7190_TempData.AD7190_SendData[1] = 0x00;
AD7190_TempData.AD7190_SendData[2] = 0x01;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
// SPI2_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);

//读模式寄存器
AD7190_TempData.AD7190_SendData[0] = 0x48;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
// buf[0] = 0x48;
for(i = 0 ;i < 4;i ++)
{
  AD7190_TempData.AD7190_SendData[i] = 0x00;
}
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
// printf("AD7190数据1:%x_%x_%x\r\n",buf[2],buf[1],buf[0]);
//读配置寄存器
AD7190_TempData.AD7190_SendData[0] = 0x50;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
for(i = 0 ;i < 4;i ++)
{
  AD7190_TempData.AD7190_SendData[i] = 0x00;
}
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,3);
// printf("AD7190数据1:%x_%x_%x\r\n",buf[2],buf[1],buf[0]);


AD7190_TempData.AD7190_SendData[0] = 0x5c;
SPI1_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);
// SPI2_Send_ReveiceFull(AD7190_TempData.AD7190_SendData,1);

for(i = 0 ;i < 4;i ++)
{
  AD7190_TempData.AD7190_SendData[i] = 0x00;
}
}


使用特权

评论回复
16
Cjy_JDxy|  楼主 | 2020-1-3 10:53 | 只看该作者
kingkits 发表于 2020-1-3 10:10
给个简单的代码仅供参考;

struct

谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:绿水本无忧因风皱面,青山原不老为雪白头。

553

主题

3520

帖子

19

粉丝