目录
准备工作
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 配置寄存器
注意
1:手册上说读数据在时钟的下降沿,而实际情况确实在上升沿;
2:ad9512的时钟输出两端要加负载才能检测到信号;
3:其中一路输入时钟没有输入时,应串上电容后接地;
4:在模拟SPI时,请先确认好你控制芯片的SPI通信模式,ad9512芯片默认使用的是模式1;
疑问
使用硬件SPI时,怎么配置成半双工模式???