STM32模拟4线SPI控制ad9512

目录

准备工作

1.软件配置工具:AD9512 Evalution Software,根据参数输出寄存器地址和值;

2.ad9512手册;
(链接:https://pan.baidu.com/s/1bvsbULYS5HP_oOx-V2Fczw 提取码:6r2y)

代码

spi.c
#include "spi.h"
#include "delay.h"

/*************************************************
  Function:       SPI初始化
  Input:          None
  Output:         None
  Return:         None
  Others:         None
*************************************************/
void SPI2_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PA端口时钟

	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;   //PA4(CS),PA5(SCLK),PA7(MOSI)  
 	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; 		                  //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                       //速度50MHz
 	GPIO_Init(GPIOA, &GPIO_InitStructure);	                                //初始化GPIOA4,5,7
 	GPIO_SetBits(GPIOA, GPIO_Pin_4);	                                      //PA4(CS) 输出高
	GPIO_ResetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_7);                         //GPIOA5、7 输出低

	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;                             //PA6(MISO)
 	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                  //浮空输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);                                  //初始化GPIOA6
}

/*************************************************
  Function:       SPI读函数
  Input:          addr:寄存器地址
  Output:         None
  Return:         recdat:读到的值
  Others:         None
*************************************************/
u8 SPI_RE_1Byte(u8 addr)
{	
	u16 sendat = 0x8000 | addr;   //读命令 + 地址
	u8 i, k, recdat;
	
	recdat = 0;                   //使用的是SPI模式1所以空闲时刻时钟为低电平
	CS=0;
	SCLK=0;
	delay_us(1);
	for(i=0;i<16;i++)
	{		
		MOSI=(sendat & 0x8000)>>15; //先输出数据再给上升沿
		sendat <<= 1;
		
		SCLK=0;
		delay_us(1);
		SCLK=1;
		delay_us(1);   
	}
	
	delay_us(1);
	
	for(k = 0; k < 8; k++)
	{
		
		SCLK=0;
		delay_us(1);
		
		recdat <<= 1;               //这里一定是先移位再读数据,否则recdat就会移动8次,
		recdat |= MISO;             //若从机发送的是0x11,读到的就是0x22;
		
		SCLK=1;
		delay_us(1);
		
	}
	
	
	SCLK=1;	 
	CS=1;
	delay_us(1);
	return recdat;
} 


/*************************************************
  Function:       SPI写函数
  Input:          addr:寄存器地址
  Output:         None
  Return:         recdat:读到的值
  Others:         None
*************************************************/
void SPI_WR_Byte(u8 addr, u8 data)
{
	u16 sendat = 0x0000 | addr;      //读命令 + 地址
	u8 i, k;
	CS=0;
	for(i=0;i<16;i++)
	{
		MOSI=(sendat & 0x8000) >> 15;	 //这里要先写再移位,若是先移位再写就会
		sendat <<= 1;                  //从bit14第二位开始发送,而不是bit15第一位开始
		
		SCLK=0;                        // 生成上升沿发出数据,
		delay_us(1);
		
		SCLK=1;
		delay_us(1);   
	}
	
	for(k = 0; k < 8; k++)
	{
		MOSI=(data & 0x80) >> 7;
		data <<= 1;
		
		SCLK=0;         
	  delay_us(1);
		
		SCLK=1;
		delay_us(1);
	}
	SCLK = 0;                        //发完数据后,记得将时钟置0,
	CS=1;
	delay_us(1);
}
spi.h
#ifndef __SPI_H
#define __SPI_H
#include "sys.h"

#define CS   PAout(4)
#define SCLK PAout(5)
#define MISO PAin(6)
#define MOSI PAout(7)
		  	    													  
void SPI2_Init(void);			 //初始化SPI口
u8   SPI_RE_1Byte(u8 addr);
void SPI_WR_Byte(u8 addr, u8 data);

控制ad9512

用AD9512 Evalution Software 配置寄存器

在这里插入图片描述
根据生成的表在对ad9512的寄存器进行配置

注意

1:手册上说读数据在时钟的下降沿,而实际情况确实在上升沿;
在这里插入图片描述

2:ad9512的时钟输出两端要加负载才能检测到信号;
3:其中一路输入时钟没有输入时,应串上电容后接地;
4:在模拟SPI时,请先确认好你控制芯片的SPI通信模式,ad9512芯片默认使用的是模式1;

疑问

使用硬件SPI时,怎么配置成半双工模式???

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值