找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3687|回复: 5
打印 上一主题 下一主题
收起左侧

基于STM32的FDC2214驱动源码

[复制链接]
跳转到指定楼层
楼主
ID:169527 发表于 2018-8-14 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验器材:
    STM32F407开发板

硬件资源:
    1,DS0(连接在PF9)     LED
    2,DS1(连接在PF10)        
    3.SDA---PB9
    4.SCL---PB8         
    5.SD---PE1
    6.ADDR---PE0
    7.INTB--- 悬空

FDC2214的stm32单片机源程序如下:
  1. /*******************************************************************************************
  2. 开发平台:STM32F407ZET6
  3. 功能说明:FDC2214传感器测试
  4. 单                位:湖北汽车工业学院电气与信息工程学院
  5. *******************************************************************************************/

  6. #include "sys.h"
  7. #include "delay.h"
  8. #include "led.h"
  9. #include "i2c.h"
  10. #include "fdc2214.h"

  11.   
  12. int main(void)
  13. {
  14.         int result=0;
  15.         u32 temp = 0;
  16.         Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
  17.         delay_init(168);                //初始化延时函数
  18.         I2C_Init();                                        //I2C初始化
  19.         LED_Init();                                  //初始化LED时钟        
  20.         fdc2214_Init();     //FDC2214初始化
  21.         //LED0 = 0;        
  22.         while(1)
  23.         {
  24.                 LED1 = 0;
  25.                
  26.                 temp=FDC_read_16bit(0x1A);
  27. //                temp =               
  28.                 printf("%d\r\n",result);
  29.                
  30.                 delay_ms(500);
  31.         }
  32. }




复制代码
  1. /*******************************************************************************************
  2. 开发平台:STM32F407ZET6
  3. 功能说明:FDC2214传感器读写数据
  4. 修改日期:
  5. 单                位:湖北汽车工业学院电气与信息工程学院

  6. *******************************************************************************************/

  7. #include "fdc2214.h"
  8. #include "delay.h"
  9. #include "i2c.h"
  10. #include "usart.h"
  11. #include "led.h"
  12. #include "FDC_cmd.h"

  13. //#define  slaver_addr    必须声明

  14. //读Channel x 的转换结果(值)
  15. u16 FDC_read_CHx(u8 CHx)        
  16. {
  17.         u8 reg_addr1 = 0;                         //MSB地址
  18.         u8 reg_addr = 0;                         //LSB地址
  19.         u16 data = 0;//接收到的数据
  20.         
  21.         switch(CHx)
  22.         {
  23.                 case 0:
  24.                 {
  25.                         reg_addr1 = DATA_CH0;
  26.                         reg_addr         = DATA_LSB_CH0;        
  27.                 }break;
  28.                 case 1:
  29.                 {
  30.                         reg_addr1 = DATA_CH1;
  31.                         reg_addr         = DATA_LSB_CH1;
  32.                 }break;
  33.                 case 2:
  34.                 {
  35.                         reg_addr1 = DATA_CH2;                        
  36.                         reg_addr         = DATA_LSB_CH2;
  37.                 }break;
  38.                 case 3:
  39.                 {
  40.                         reg_addr1 = DATA_CH3;
  41.                         reg_addr         = DATA_LSB_CH3;
  42.                 }break;
  43. //                data = ;
  44.                 default: return 0;        //输入错误
  45.                
  46.         }
  47.         
  48.         //printf("%d \r\n",LCD_read_16bit(reg_addr1));
  49.         //printf("%d \r\n",LCD_read_16bit(reg_addr));                //不知道LSB寄存器有什么用,手册也没见有
  50.         data = FDC_read_16bit(reg_addr1);        //读取寄存器值
  51.         data = data & 0x0FFF;         //转换结果在 [11:0],把它取出来
  52.         
  53.         return data;
  54. }


  55. //fdc2214初始化(寄存器的配置)重点
  56. void fdc2214_Init()
  57. {
  58.                 I2C_Init();                     //I2C初始化
  59.                 FDC_SD = 0;        // 上电。0---退出睡眠模式,1---进入休眠模式   pin---PE1
  60.                 FDC_ADDR = 1;                         //        选择FDC地址 0---0x2a  1---0x2b                               pin---PE0
  61.                 delay_ms(500);        //延时500ms
  62.         
  63.                 FDC_write_16bit(RCOUNT_CH0,0x8329);//ADDRESS:0x08  
  64.                 FDC_write_16bit(RCOUNT_CH1,0x8329);//ADDRESS:0x09
  65.                 FDC_write_16bit(RCOUNT_CH2,0x8329);//ADDRESS:0x0A
  66.                 FDC_write_16bit(RCOUNT_CH3,0x8329);//ADDRESS:0x0B
  67.                
  68.                 FDC_write_16bit(SETTLECOUNT_CH0,0x000A);         //ADDRESS:0x10
  69.                 FDC_write_16bit(SETTLECOUNT_CH1,0x000A);         //ADDRESS:0x11
  70.                 FDC_write_16bit(SETTLECOUNT_CH2,0x000A);         //ADDRESS:0x12
  71.                 FDC_write_16bit(SETTLECOUNT_CH3,0x000A);         //ADDRESS:0x13
  72.         
  73.                 FDC_write_16bit(CLOCK_DIVIDERS_CH0,0x2002);//ADDRESS:0x14
  74.                 FDC_write_16bit(CLOCK_DIVIDERS_CH1,0x2002);//ADDRESS:0x15
  75.                 FDC_write_16bit(CLOCK_DIVIDERS_CH2,0x2002);//ADDRESS:0x16
  76.                 FDC_write_16bit(CLOCK_DIVIDERS_CH3,0x2002);//ADDRESS:0x17               
  77.                                 
  78.                 FDC_write_16bit(ERROR_CONFIG,0x0000);                         //ADDRESS:0x19
  79.         
  80.                 FDC_write_16bit(MUX_CONFIG,0xC20D);                          //ADDRESS:0x1B
  81.         
  82.                 FDC_write_16bit(DRIVE_CURRENT_CH0,0x7C00); //ADDRESS:0x1E
  83.                 FDC_write_16bit(DRIVE_CURRENT_CH1,0x7C00); //ADDRESS:0x1F
  84.                 FDC_write_16bit(DRIVE_CURRENT_CH2,0x7C00); //ADDRESS:0x20
  85.                 FDC_write_16bit(DRIVE_CURRENT_CH3,0x7C00); //ADDRESS:0x21

  86.                 FDC_write_16bit(CONFIG,0x1601);                                                 //bit13 清零 退出睡眠模式
  87.         
  88.         
  89.                         fdc2214_write(CLOCK_DIVIDERS_CH0,0x2001);  //设置为单通道模式
  90.                         fdc2214_write(DRIVE_CURRENT_CH0,0x7C00);         //传感器驱动电流配置        
  91.                         fdc2214_write(SETTLECOUNT_CH0,0x000A);                 //传感器建立最短时间         
  92.                         fdc2214_write(RCOUNT_CH0,0x2089);                                         //计数器寄存器
  93.                         fdc2214_write(MUX_CONFIG,0xC20D);                                         //多通道模式
  94.                         fdc2214_write(ERROR_CONFIG,0x0000);
  95.                         fdc2214_write(CONFIG,0x1401);              //使用内部晶振
  96.                         
  97.         
  98. }


  99. /*  向 FDC2214 写数据  */
  100. void fdc2214_write(int dateAddr,int date)
  101. {
  102.         u16 FDC2214_Address;
  103.         
  104.         unsigned char REG_data_H=0,REG_data_L=0;     
  105.         REG_data_H=(unsigned char) (date&0XFF);      
  106.         REG_data_L=(unsigned char) ((date&0XFF00)>>8);
  107.         
  108.         I2C_Start();
  109.         I2C_Send_Byte(FDC2214_Address);
  110.         while(I2C_Wait_Ack());
  111.         LED0=0;
  112.   
  113.         I2C_Send_Byte(dateAddr);
  114.         while(I2C_Wait_Ack());
  115.         
  116.         I2C_Send_Byte(REG_data_H);
  117.         while(I2C_Wait_Ack());
  118.         
  119.         I2C_Send_Byte(REG_data_L);
  120.         while(I2C_Wait_Ack());
  121.         
  122.         I2C_Stop();
  123. }


  124. /* 从 FDC2214 读数据  */
  125. unsigned int FDC2214_Read(int firstAddr,int SecondAddr)
  126. {
  127.         u8 FDC2214_W;
  128.         u8 FDC2214_R;
  129.         unsigned int temp;                                          //定义一个变量,作为28位数据的返回值
  130.          u8 result[4];                                                                        //定义4个8位的数据结果
  131.         I2C_Start();                                                                        //I2C开始                        
  132.         I2C_Send_Byte(FDC2214_W);                        //I2C发送一个字节,对FDC2214进行寻址,并将后续为写操作(FDC2214_W)
  133.         while(I2C_Wait_Ack());                                //等待应答
  134.         I2C_Send_Byte(firstAddr);                        //发送一个字节,选中第一个寄存器(地址),用于存储高12位数据
  135.         while(I2C_Wait_Ack());
  136.         I2C_Stop();        
  137.         
  138.         I2C_Start();
  139.         I2C_Send_Byte(FDC2214_R);                        //I2C发送一个字节,对FDC2214进行寻址,并将后续为读操作(FDC2214_R)
  140.         while(I2C_Wait_Ack());
  141.         result[0]=I2C_Read_Byte(1);                //1:有应答
  142.         result[0] = result[0]<<4;                        //先左移4位,将第一个数据寄存器的高4位(非数据位)移出去
  143.         result[0] = result[0]>>4;                        //再右移4位
  144.         result[1]=I2C_Read_Byte(1);                //temp=高字节+低字节         此时已经将12位数据读出        
  145.         I2C_Stop();        
  146.         
  147.   I2C_Start();
  148.         I2C_Send_Byte(FDC2214_W);                        //I2C发送一个字节,对FDC2214进行寻址,并将后续为写操作(FDC2214_W)
  149.         while(I2C_Wait_Ack());
  150.         I2C_Send_Byte(SecondAddr);                //发送一个字节,选中第二个寄存器(地址),用于存储低16位数据
  151.         while(I2C_Wait_Ack());
  152.         
  153.   I2C_Start();
  154.         I2C_Send_Byte(FDC2214_R);                        //I2C发送一个字节,对FDC2214进行寻址,并将后续为读操作(FDC2214_R)
  155.         while(I2C_Wait_Ack());                                //接下来读取低16位数据
  156.         result[2]=I2C_Read_Byte(1);                //读取出高8位
  157.         result[3]=I2C_Read_Byte(1);                //读取出低8位

  158.         //将读取出来的4次数据进行整合
  159.   temp = (unsigned int)(((result[0]<< 24) | (result[1] << 16) | (result[2] << 8) | (result[3] & 0xff)));  //将4次读出来的数据进行整合
  160.         return(temp);
  161. }
复制代码

所有资料51hei提供下载:
FDC2214(LJA).rar (149.56 KB, 下载次数: 89)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:396406 发表于 2018-9-14 10:17 | 只看该作者
先下载看看
回复

使用道具 举报

板凳
ID:379683 发表于 2019-7-10 16:37 | 只看该作者
大佬谢谢
回复

使用道具 举报

地板
ID:379683 发表于 2019-7-10 16:38 | 只看该作者
大佬谢谢
回复

使用道具 举报

5#
ID:597397 发表于 2019-8-8 13:42 | 只看该作者
正在找这个
回复

使用道具 举报

6#
ID:598309 发表于 2019-8-9 15:53 | 只看该作者

这个源代码可以让2214的数据传到32里面么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表