最近买了一块ADI公司的AD5686R可编程电源芯片的评估板EVAL-AD5686R,上面留下了PMOD接口,现在手头有一块STM32的开发板,虽然stm32f4芯片自带SPI功能,但我是个菜鸟,就用了一个比较笨的办法,直接用GPIO模拟SPI时序,把值写进AD5686R,附件中有时序图。
我自己先尝试了一下,但是不成功,下面是我自己的方法,希望各位能帮我找找错误。
这是我的代码:
首先是端口的初始化,我用的是F端口
void GPIO_ini
tial()
{
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