ADI 技术
直播中

丁朋

6年用户 8经验值
擅长:可编程逻辑 模拟技术 嵌入式技术 接口/总线/驱动 处理器/DSP
私信 关注
[问答]

如何用stm32的GPIO模拟AD5686R的SPI时序并通过其评估板上的PMOD接口写入一个值,盼望高人,急救

       最近买了一块ADI公司的AD5686R可编程电源芯片的评估板EVAL-AD5686R,上面留下了PMOD接口,现在手头有一块STM32开发板,虽然stm32f4芯片自带SPI功能,但我是个菜鸟,就用了一个比较笨的办法,直接用GPIO模拟SPI时序,把值写进AD5686R,附件中有时序图。

      我自己先尝试了一下,但是不成功,下面是我自己的方法,希望各位能帮我找找错误。
这是我的代码:
首先是端口的初始化,我用的是F端口
void GPIO_initial()
{
        GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能端口F时钟
        
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;//管脚设置
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_25MHz;//速度为25M
        GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
        GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化结构体
        GPIO_SetBits(GPIOF,GPIO_Pin_6);reset信号
        GPIO_SetBits(GPIOF,GPIO_Pin_7);//SYNC信号
        GPIO_SetBits(GPIOF,GPIO_Pin_8);//SCLK信号
        GPIO_SetBits(GPIOF,GPIO_Pin_9);//数据输出口
        GPIO_SetBits(GPIOF,GPIO_Pin_10);//LDAC
}

接下来是把data写入芯片的函数,由于芯片内是24位寄存器,所以就循环了24次
void transfer_data(u32 data)
{
        u32 testbit=0x10000000;//测试位
        u8 i;
        GPIO_ResetBits(GPIOF,GPIO_Pin_7);//SYNC电平拉低,启动传输
        delay_t();
        for(i=24;i>0;i--)//循环24次,传输24位数据
        {
                if(data & testbit)//与测试位相与,如果为1就传输1,如果为0就传输0
                {
                        GPIO_SetBits(GPIOF,GPIO_Pin_9);
                }
                else GPIO_ResetBits(GPIOF,GPIO_Pin_9);
                delay_t();
                GPIO_ResetBits(GPIOF,GPIO_Pin_8);//SCLK下降沿
                delay_t();
                GPIO_SetBits(GPIOF,GPIO_Pin_8);//SCLK拉高
                if(i==1)
                {
                        GPIO_SetBits(GPIOF,GPIO_Pin_7);//拉高SYNC,停止传输数据
                }
                data<<=1;
        }
        GPIO_ResetBits(GPIOF,GPIO_Pin_10);//拉低LDAC,更新DAC寄存器的值
        delay_t();
        GPIO_SetBits(GPIOF,GPIO_Pin_10);
}


我的硬件连接是,VDD=5V VIO=3.3V,GAIN引脚连接到GND,RSTSEL引脚连接到VDD,附件里还有AD5686R以及EVAL-AD5686R的datasheet, 小弟在此谢过了


补充内容 (2018-11-23 20:00):
找到错误了,测试位应为0x80000000
  • AD5686R串行写入时序图

更多回帖

发帖
×
20
完善资料,
赚取积分