• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

我想实现STM32F4驱动AD7705的功能,代码如下,编译

1099b6fd1bebc2f5 2020-07-13 浏览量:757
#include "stm32f4xx.h"
#include "usart.h"
#include "lcd.h"
#include "delay.h"
#include "led.h"
#include "stdio.h"


void RCC_Configuration(void);
void GPIO_Configuration(void);
u16 SPIx_ReadWriteByte(u16 TxData);

void SPIx_Init(void);
u16 ReadTM7705(void);
uint8_t TM7705_Recive8Bit(void); 
void TM7705_Send8Bit(uint8_t _data);


void Delay(vu32 nCount)
{
       for(; nCount != 0; nCount--);
}


void GPIO_Configuration(void)
{

        GPIO_InitTypeDef GPIO_InitStructure;
        /@@* Configure USART1 Rx (PB.8) as input floating  busy busy DRDY */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
              GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP ;
                    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA &GPIO_InitStructure);
}

/@@********ÅäÖÃÏμí3ê±Öóê1Äü¸÷íaéèê±Öó***********/
void RCC_Configuration(void)
{
  SystemInit();        
  RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA ENABLE );
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1| RCC_APB2Periph_USART1 ENABLE);
}

/@@********TM77053õê¼»ˉoˉêy***********/
void TM7705_Init(void)
{         
        unsigned char i ;
        for(i = 0; i < 100; i++)
    { 
        SPIx_ReadWriteByte(0xFF);                        
    }
        SPIx_ReadWriteByte(0x20) ;                    
        Delay(800); 
        SPIx_ReadWriteByte(0x02) ;                  
        Delay(800);
        SPIx_ReadWriteByte(0x10) ;                         
        Delay(800);
        SPIx_ReadWriteByte(0x44) ;                        
        Delay(8000);
}

/@@********¶á16λêy¾Y************/
u16 ReadTM7705_16BitValue(void)

        //unsigned long
                                u16        DataL = 0;
       // unsigned long
                                u16        DataH = 0;
        //unsigned long
                                u16        Ret = 0;

        DataH =SPIx_ReadWriteByte(0xff);
              delay_ms(10);
               DataH = DataH << 8;

              DataL = SPIx_ReadWriteByte(0xff); 

              delay_ms(10);
        Ret = DataH | DataL; 

        return(Ret) ;                             
}

/@@********¶áè¡AD7705μúò»í¨μàêy¾Y************/
u16 ReadTM7705(void)
{


                u16        Ret = 0;

                 SPIx_ReadWriteByte(0x38) ;
  while(GPIO_ReadInputDataBit(GPIOA GPIO_Pin_10==1))
                                {
                                        ;
                                }             
        Ret = ReadTM7705_16BitValue();
        delay_ms(100); 

        return Ret;
}


/@@****************************SPI3õê¼»ˉ*************************/
void SPIx_Init(void)
        {         
        SPI_InitTypeDef SPI_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOA ENABLE);//
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ENABLE);

              GPIO_PinAFConfig(GPIOBGPIO_PinSource3GPIO_AF_SPI1);
              GPIO_PinAFConfig(GPIOBGPIO_PinSource4GPIO_AF_SPI1);
              GPIO_PinAFConfig(GPIOBGPIO_PinSource5GPIO_AF_SPI1);

        /@@* Configure SPI1 pins: SCK MISO and MOSI */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //¸′óÃíÆíìêä3ö
       GPIO_InitStructure.GPIO_OType=GPIO_OType_PP ;
    //GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP ;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB &GPIO_InitStructure);

        /@@* Configure I/O for Flash Chip select */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  //SPI CS
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  //¸′óÃíÆíìêä3ö
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP ;
       GPIO_InitStructure.GPIO_OType=GPIO_OType_PP ;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA &GPIO_InitStructure);

        /@@* Deselect the FLASH: Chip Select high */
        GPIO_SetBits(GPIOAGPIO_Pin_9);
       // GPIO_SetBits(GPIOAGPIO_Pin_10);

                    SPI_Cmd(SPI1 DISABLE); 

                    /@@* SPI1 configuration */
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;              
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;             
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;       
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;             
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
        SPI_InitStructure.SPI_CRCPolynomial = 7;          
        SPI_Init(SPI1 &SPI_InitStructure);           

        //SPI1->CR1|=1<<6; 
        /@@* Enable SPI1  */
        SPI_Cmd(SPI1 ENABLE); 

        SPIx_ReadWriteByte(0xff);              
}  



u16 SPIx_ReadWriteByte(u16 TxData)
{                
        GPIO_ResetBits(GPIOAGPIO_Pin_9);        
        while (SPI_I2S_GetFlagStatus(SPI1 SPI_I2S_FLAG_TXE) == RESET); //

        /@@* Send byte through the SPI1 peripheral */
        SPI_I2S_SendData(SPI1 TxData)
        while (SPI_I2S_GetFlagStatus(SPI1 SPI_I2S_FLAG_RXNE) == RESET); //

        /@@* Return the byte read from the SPI bus */               
        GPIO_SetBits(GPIOAGPIO_Pin_9);  

        return SPI_I2S_ReceiveData(SPI2); //·μ»Øí¨1ySPIx×î½ü½óêÕμÄêy¾Y   
}


/@@********Ö÷oˉêy************/
int main(void)
{         
u16 adcx;
float temp; 

        RCC_Configuration();
        GPIO_Configuration();
              uart_init(76800);
        delay_init(168);
        LCD_Init();
              LED_Init();
              SPIx_Init();    
        TM7705_Init();

              POINT_COLOR=BLUE;
              LCD_ShowString(301102001616"ADC_CH1_VAL:");              
              LCD_ShowString(301702001616"ADC_CH1_VOLL:0.0000V");        

while(1)
      {
       //delay_ms(50);

       adcx = ReadTM7705();  

                   LCD_ShowxNum(134110adcx5160);   
                   temp=(float)adcx*(3.0/65535);          
             adcx=temp;                           
                   LCD_ShowxNum(134170adcx1160);   
                   temp-=adcx;                           
                   temp*=10000;                           
                   LCD_ShowxNum(150170temp4160X80); 
                   LED0=!LED0;
                   delay_ms(200);        

        }


}


LCD显示出来的一直是最大值65535。。。。应该是数据异常。。。。。。debug的时候SPI里面数据寄存器的数值好像不太正常。。。。求大神帮帮忙。。谢谢啦!
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
所有亮答 数量:2
  • 感觉是SPI根本没通信上,如果SPI上面什么数据都没有,那读取到的值就一直是0xff了

    这种情况可以先尝试做SPI回环,确认SPI是不是正常工作

  • 7705配置对了吗。

    另外,先试试SPI接口通信是否正常。

    感觉还是初始化没做好。

相关问题

问题达人换一批

我想实现STM32F4驱动AD7705的功能,代码如下,编译