DW9714是一款驱动摄像头对焦马达的IC,主要通过I2C进行控制,目前在linux内核目录Linux/drivers/media/i2c/下可以找到dw9714.c的驱动,使用MCU驱动的几乎没有

所以自己照着数据手册写了一个。板子是正点原子STM32F767开发板,使用管脚PD3->XSD  PD4->SCL  PD5->SDA。方式:普通管脚模拟I2C

myiic.h(原子的)

#ifndef _MYIIC_H
#define _MYIIC_H
#include "sys.h"//IO方向设置
#define SDA_IN()  {GPIOD->MODER&=~(3<<(5*2));GPIOD->MODER|=0<<5*2;} //PD5输入模式
#define SDA_OUT() {GPIOD->MODER&=~(3<<(5*2));GPIOD->MODER|=1<<5*2;} //PD5输出模式
//IO操作
#define IIC_SCL(n)  (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET)) //SCL
#define IIC_SDA(n)  (n?HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET)) //SDA
#define READ_SDA    HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_5)  //输入SDA//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口
void IIC_Start(void);               //发送IIC开始信号
void IIC_Stop(void);                //发送IIC停止信号
void IIC_Send_Byte(u8 txd);         //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void);              //IIC等待ACK信号
void IIC_Ack(void);                 //IIC发送ACK信号
void IIC_NAck(void);                //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);
#endif

myiic.c

#include "myiic.h"
#include "delay.h"//IIC初始化
void IIC_Init(void)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOD_CLK_ENABLE();   //使能GPIOD时钟//PD4,5初始化设置GPIO_Initure.Pin=GPIO_PIN_4|GPIO_PIN_5;GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_FAST;     //快速HAL_GPIO_Init(GPIOD,&GPIO_Initure);IIC_SDA(1);IIC_SCL(1);
}//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA(1);       IIC_SCL(1);delay_us(4);IIC_SDA(0);//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL(0);//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL(0);IIC_SDA(0);//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL(1); delay_us(4);           IIC_SDA(1);//发送I2C总线结束信号
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA(1);delay_us(1);    IIC_SCL(1);delay_us(1);   while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL(0);//时钟输出0       return 0;
}
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(0);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(1);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL(0);//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA((txd&0x80)>>7);txd<<=1;      delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL(1);delay_us(2); IIC_SCL(0);    delay_us(2);}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL(0); delay_us(2);IIC_SCL(1);receive<<=1;if(READ_SDA)receive++;   delay_us(1); }                   if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

dw9714.h

#ifndef _DW9714_H
#define _DW9714_H
#include "sys.h"
#include "myiic.h"#define STEP_0 0x00
#define STEP_1 0X04
#define STEP_2 0X08
#define STEP_4 0X0C#define Period_80us 0x00
#define Period_160us 0X01
#define Period_320us 0X02
#define Period_640us 0X03void DW9714_XSD_Init(void);
void DW9714_Init(void);
u8 DW9714_WriteOneByte(u8 WriteAddr,u8 byte1,u8 byte2);
u8 VCM_driver_noSRC(u8 WriteAddr,unsigned char S);
u8 VCM_driver_SRC(u8 WriteAddr,unsigned char S,u8 step,u8 period);
void DW9714_mode_set(u8 flag);//Shutdown mode (active low)#endif

dw9714.c

#include "dw9714.h"
#include "delay.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
//The I2C address for the DW9714 is 0x18>>1=0x0C.//初始化IIC接口void DW9714_Init(void)
{delay_ms(12);IIC_Init();//IIC初始化DW9714_XSD_Init();}
void DW9714_XSD_Init(void)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOD_CLK_ENABLE();            //开启GPIOD时钟GPIO_Initure.Pin=GPIO_PIN_3; //PB0,1GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速HAL_GPIO_Init(GPIOD,&GPIO_Initure);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET); //PD3置0delay_ms(100);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);  //PD3置1}
void DW9714_mode_set(u8 flag)//Shutdown mode (active low)
{switch(flag){case 0:HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET);    //PD3置0break;case 1:HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);   //PD3置1break;}
}//在DW9714指定地址写入两个字节
//WriteAddr  :写入数据的目的地址
//byte1 byte2:要写入的数据
u8 DW9714_WriteOneByte(u8 WriteAddr,u8 byte1,u8 byte2)
{u8 Wait_Ack_flag=0;IIC_Start();  IIC_Send_Byte(WriteAddr);   //发送器件地址0X0c,写数据      Wait_Ack_flag = IIC_Wait_Ack();      IIC_Send_Byte(byte1);     //发送字节                            Wait_Ack_flag = IIC_Wait_Ack();         IIC_Send_Byte(byte2);     //发送字节                               Wait_Ack_flag = IIC_Wait_Ack(); IIC_Stop();//产生一个停止条件 delay_ms(10);  return Wait_Ack_flag;
}u8 VCM_driver_noSRC(u8 WriteAddr,unsigned char S)
{unsigned char weiyin = S; //0-120int D9_D0=weiyin/120.0*1023.0;int byte = D9_D0<<4;return DW9714_WriteOneByte(WriteAddr,(byte/256),(byte%256));}u8 VCM_driver_SRC(u8 WriteAddr,unsigned char S,u8 step,u8 period)
{unsigned char weiyin = S; //0-120int D9_D0=weiyin/120.0*1023.0;int byte = D9_D0<<4;return DW9714_WriteOneByte(WriteAddr,(byte/256),(byte%256)|step|period);}

提供工程文件下载

https://download.csdn.net/download/qq_32856147/19203652

STM32F767 使用I2C驱动DW9714,控制VCM音圈电机位移相关推荐

  1. VCM 音圈电机 (马达)Voice Coil Motor

    **VCM(Voice Coil Motor)**指电子学里面的音圈电机,是马达的一种. 因为原理和扬声器类似,所以叫音圈电机.具有高频响.高精度的特点. 原理是在一个永久磁场内,改变马达内线圈的直流 ...

  2. vcm驱动芯片原理_每周一品 · 音圈电机(VCM)中的磁性材料

    音圈电机 (Voice coil motor, VCM) 是一种特殊形式的直驱电机,能将电能直接转化为直线运动机械能,其原理是在均匀气隙磁场中放入一个圆筒绕组,绕组通电产生磁场,带动负载设备做直线往复 ...

  3. 每周一品 · 音圈电机(VCM)中的磁性材料

    音圈电机 (Voice coil motor, VCM) 是一种特殊形式的直驱电机,能将电能直接转化为直线运动机械能,其原理是在均匀气隙磁场中放入一个圆筒绕组,绕组通电产生磁场,带动负载设备做直线往复 ...

  4. 第八章:拆解VCM音圈马达,原理、结构

    慧眼网 邓林供稿 第一章我们介绍了小孔成像的原理,实验中通过移动标尺即可在光屏上投影出清晰的蜡烛图像.在手机摄像头中,这个移动标尺的功能由VCM马达承担. 一.VCM是什么 VCM(Voice Coi ...

  5. 拆解VCM音圈马达,原理、结构

    转自http://www.52rd.com/S_TXT/2014_10/TXT62308.HTM 感谢作者! 一.VCM是什么 VCM(Voice Coil Motor),电子学里面的音圈电机,是马达 ...

  6. VCM音圈马达的一些特点

    VCM(Voice Coil Motor):中文名称为音圈马达,亦称音圈电机,原理是在一个固定的磁场内,通过改变VCM线圈电流的大小,来控制VCM马达移动的位置,从而改变镜片之间的距离来达到对焦的功能 ...

  7. 高频高精度圆柱形音圈电机 微型VCM 直线电机模组 音圈马达

    ➤01 音圈电机 在 高频高精度圆柱形音圈电机 微型VCM 直线电机模组 音圈马达-淘宝网 购买到音圈电机.这是在 P5压电陶瓷致动器,纵向极化,叠堆压电陶瓷,多层压电陶瓷促动器 推文之后,佟超给出的 ...

  8. 霍尔元件在VCM音圈马达中的应用

    音圈马达(音圈电机)自动对焦装置又称为音圈马达自动对焦驱动器,此驱动器可分为移动部件与固定部件两大部分,移动部件包括镜头模组Lens.镜头座Holder以及两个永磁铁Magnets:而固定部件包括一个 ...

  9. 音圈电机工作原理与直线电机的对比

    图片来自:什么是音圈电机?如何工作的?如何应用于相机镜头调焦? - 知乎 目录 1. 什么是音圈? 2.音圈电机(VCM,Voice Coil Motor)结构及原理 2.1 音圈电机工作原理 2.2 ...

最新文章

  1. 【CSS练习】IT修真院--练习4-移动端界面
  2. UA OPTI570 量子力学 Quasi-classical states与Displacement Operator
  3. 4.7 CNN 特征可视化-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  4. vagrant 基本命令讲解
  5. wxWidgets:实时传输时间RTTI
  6. 超3000岗位!腾讯产业互联网新年大扩招!
  7. mysql数据库事务有几种特性_面试官:你能说说事务的几个特性是啥?有哪几种隔离级别?...
  8. pdf文件的处理(弄成小容量大小的文本文件)
  9. 单片机 队列 C语言 OLED 示波器 心率波形 显示 MSP430F5529 pulsesensor ADS1292R
  10. book mac pro怎么重装系统_Macbook Pro 2011完全重装系统
  11. LaTeX中文伪代码
  12. 云计算基础设施的定义与介绍
  13. dell进入u盘启动模式_戴尔主板bios设置u盘启动
  14. 岭回归(Ridge Regression)、OLS和吉洪诺夫正则化(Тихонов regularization)
  15. aspose给word添加水印
  16. Win11如何关闭自动更新?Win11更新服务关闭教程
  17. google订阅消息推送
  18. 论文介绍《CrowdFormer: An Overlap Patching Vision Transformer for Top-Down Crowd Counting 》
  19. 数据结构:链表逆序输出
  20. github搜索方法

热门文章

  1. 道路监控传输资源紧张?PON技术的五大特点
  2. 表情消消乐WEB游戏源码
  3. html滚动字幕高度,jquery取div scrollHeight(滚动文字的实际高度)scrollHeight获取
  4. 我的新浪微博欢迎大家互粉
  5. 【Mybatisplus】创建spring boot工程QueryWrapper的使用
  6. 仓储物流中心| 地坪 | 工程设计要点
  7. 5分钟让免费的 Linux KVM 虚机管理跟 VMWare 一样好用
  8. Java前叉夹器_传统夹器和碟刹公路如何选择
  9. uniapp离线打包具体步骤
  10. listbox java_如何将所选项从一个listBox添加到另一个listBox