OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10078|回复: 17

STM32F407+AD7606 SPI通信,程序写好后读不出数据,一直是0

[复制链接]

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
发表于 2021-6-17 14:39:19 | 显示全部楼层 |阅读模式
10金钱
初始化AD7606
void InitAD7606(void)
{
        AD7606_ConfigGPIO();        配置IO
        AD7606_SETOS(0);      设置波特率
        AD7606_RESET();                硬件复位函数               
        AD7606_CONVST_H;                拉高CONSt       
}

AD7606复位函数
void AD7606_RESET(void)
{
          AD7606_CS_H;
          AD7606_SCLK_H;

        AD7606_RESET_L;
       
        AD7606_RESET_H;
        AD7606_RESET_H;
        AD7606_RESET_H;
        AD7606_RESET_H;
       
        AD7606_RESET_L;
}

配置IO,CS,OS{123},,RST,CONST(输出模式)           BUSY(输入模式)
static void AD7606_ConfigGPIO(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC| RCC_AHB1Periph_GPIOD| RCC_AHB1Periph_GPIOE, ENABLE);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;               
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;               
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  //RESET
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
  //CONVST,
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        //OS[2:0]
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
        //PIN_CS
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;               
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;               
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
  //BUSY
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
}
SPI初始化
void InitSPI(void)
{

        GPIO_InitTypeDef  GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);
       
       
        /* 配置SPI的SCK,MISO,MOSI三根引脚*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;               
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;               
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        /* ÅäÖÃGPIOÎa¸¡¶ˉêäèëÄ£ê½(êμ¼êéÏCPU¸′λoó¾íêÇêäèë×′ì¬) */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;               
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;               
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;       
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
        GPIO_Init(GPIOB, &GPIO_InitStructure);


        /* ÅäÖÃ SCK, MISO ¡¢ MOSI Îa¸′óÃ1|Äü */
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

  RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);
//        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;       
   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;       
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                       
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;               
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                       
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
        SPI_InitStructure.SPI_CRCPolynomial = 7;                       
        SPI_Init(SPI2, &SPI_InitStructure);
        SPI_Cmd(SPI2, ENABLE);                               

}
开启扫描
void AD7606_Scan(void)                
{
        uint8_t i;                               
        if (BUSY_IS_LOW())          
    {
                AD7606_CS_L;
       
                for (i = 0; i < 8; i++)
                {
                        s_adc_now[i] = spiRead1();
                        s_adc_now[i] = s_adc_now[i] * 256 + spiRead1();
                }
                AD7606_CS_H;
                AD7606_STARTCONV();       
               
                while (BUSY_IS_LOW());
        }
}          

读取SPI数据
uint8_t spiRead1(void)
{       
//        uint8_t i;
//        uint8_t read = 0;
//        for (i = 0; i < 8; i++)
//        {
//                       
//                AD7606_SCLK_L;
//    spiDelay();
//                read = read << 1;
//                if (AD7606_DOUTA == 1)
//                {
//                        read++;
//                }
//                AD7606_SCLK_H;
//       spiDelay();       
//        }
//        return read;

        uint8_t read;
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI2, 0);
        while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
        read = SPI_I2S_ReceiveData(SPI2);
        return read;
}


开启转换
void AD7606_STARTCONV(void)
{
  AD7606_CONVST_L;
  AD7606_CONVST_L;
  AD7606_CONVST_L;
       
  AD7606_CONVST_H;
}


int16_t AD7606_ReadAdc(uint8_t _ch)
{
        int16_t sAdc;
       
        DISABLE_INT();       
        sAdc = s_adc_now[_ch];
        ENABLE_INT();
        return sAdc;
}

对数据处理
void AD7606_Mak(void)
{
        uint8_t i;
        int16_t adc;
        for (i = 0;i < 8; i++)
        {       
                s_dat[i] = AD7606_ReadAdc(i);
                adc = s_dat[i];
                        s_volt[i] = (adc * 10000) / 32767;
        }
}



最佳答案

查看完整内容[请看2#楼]

已解决,是模块问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-6-17 14:39:20 | 显示全部楼层
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-6-18 13:44:22 | 显示全部楼层
时序对吗?
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-6-18 15:29:47 | 显示全部楼层

时序和引脚都查过了,我认为可能是SPI那块出了问题,但又不知道错在哪里
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-6-18 16:42:02 | 显示全部楼层
wangyang123 发表于 2021-6-18 15:29
时序和引脚都查过了,我认为可能是SPI那块出了问题,但又不知道错在哪里

上示波器,看实际的时序
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-6-20 14:29:36 | 显示全部楼层
阿侑kevin 发表于 2021-6-18 16:42
上示波器,看实际的时序

看过了,时序没问题
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-6-20 14:30:35 | 显示全部楼层
阿侑kevin 发表于 2021-6-18 16:42
上示波器,看实际的时序

我发现读取那一块有问题,read返回值一直是255
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2021-6-21 09:16:14 | 显示全部楼层
wangyang123 发表于 2021-6-20 14:30
我发现读取那一块有问题,read返回值一直是255

那还是时序问题吧,正常你读个什么配置寄存器也不会出现全是0xFF的情况
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2021-2-22
在线时间
15 小时
发表于 2021-7-13 14:29:02 | 显示全部楼层
现在解决了吗?
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-7-13 14:50:20 | 显示全部楼层

没有·
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-7-13 14:51:52 | 显示全部楼层

找不出问题
回复

使用道具 举报

1

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2021-2-22
在线时间
15 小时
发表于 2021-7-19 09:27:30 | 显示全部楼层
我倒是发现这个东西有时候准有时候不准,就很离谱,或许可以交流一下
回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-8-1 16:41:59 | 显示全部楼层
houzhuhouzhu 发表于 2021-7-19 09:27
我倒是发现这个东西有时候准有时候不准,就很离谱,或许可以交流一下

是的,、

回复

使用道具 举报

6

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2020-7-11
在线时间
23 小时
 楼主| 发表于 2021-8-1 18:45:04 | 显示全部楼层
houzhuhouzhu 发表于 2021-7-19 09:27
我倒是发现这个东西有时候准有时候不准,就很离谱,或许可以交流一下

帮忙看下新帖
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-8-2 13:41:59 | 显示全部楼层
帮顶  
回复

使用道具 举报

9

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
416
金钱
416
注册时间
2018-6-6
在线时间
126 小时
发表于 2021-8-3 17:55:57 | 显示全部楼层
绑定,两年前碰到过,后来解决了。不过忘了怎么解决的
回复

使用道具 举报

18

主题

151

帖子

0

精华

高级会员

Rank: 4

积分
500
金钱
500
注册时间
2020-4-22
在线时间
239 小时
发表于 2021-8-9 17:32:13 | 显示全部楼层

我F1,引脚模式配错了,也是返回ff
回复

使用道具 举报

4

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2021-1-7
在线时间
31 小时
发表于 2021-9-9 16:30:46 | 显示全部楼层
请问是如何解决的啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表