OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4538|回复: 12

II2C中的AD5110

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-2
在线时间
5 小时
发表于 2016-6-8 09:43:24 | 显示全部楼层 |阅读模式
5金钱
II2C通信中的AD5110编程怎么弄  具体过程是什么   AD5110和24C02相比有什么区别

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-6-8 10:02:43 | 显示全部楼层
原來還有這種東西...可程序的可變電阻....
IIC的格式都差不多阿...
你會問這問題表示你24C02的程序沒看懂

回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11476
金钱
11476
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-6-8 10:02:58 | 显示全部楼层

读、写的操作过程都一样,
起始、停止、地址、应答,这些都一样。

只是写入的数据、读出的数据是有物理意义的,
比如写入的数据是控制命令,读出的是内部状态。

车还是那辆车,以前装白菜,现在运旅客。



回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-2
在线时间
5 小时
 楼主| 发表于 2016-6-8 10:43:03 | 显示全部楼层
civic7366 发表于 2016-6-8 10:02
原來還有這種東西...可程序的可變電阻....
IIC的格式都差不多阿...
你會問這問題表示你24C02的程序沒看懂 ...

能不能发个例程给我   我现在很需要这个
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-6-2
在线时间
5 小时
 楼主| 发表于 2016-6-8 10:44:02 | 显示全部楼层
能不能发个例程给我
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-6-8 14:58:27 | 显示全部楼层
原子的範例程序不就是了...

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2016-6-8 23:19:18 | 显示全部楼层
自己参照着写就是了,端午节三天总搞的定了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-12
在线时间
13 小时
发表于 2016-6-13 15:24:19 | 显示全部楼层
同求,急需,有的就给我们共享一下,希望你们能体会新手的苦
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-6-2
在线时间
43 小时
发表于 2016-6-13 15:35:26 | 显示全部楼层
这是我的I2C读写AD5274写正常,读有点问题
------------------------------------------------

#include <board.h>
#include <rtthread.h>
#include <finsh.h>
#include "public.h"

#define GPIOB_MODE *(volatile uint32_t *)0x40020400

#define SDAL     GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define SDAH     GPIO_SetBits(GPIOB,GPIO_Pin_7)
                                       
#define SCLL     GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define SCLH     GPIO_SetBits(GPIOB,GPIO_Pin_6)

#define SDA_READ GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7)

#define RESETL   GPIO_ResetBits(GPIOB,GPIO_Pin_3)
#define RESETH   GPIO_SetBits(GPIOB,GPIO_Pin_3)

#define SDA_IN   {GPIOB_MODE &= 0xFFFF3FFF;}
#define SDA_OUT  {GPIOB_MODE |= (0x8FFF);}

#define ADDR     0x5e

/* To use the I2C at 400 KHz (in fast mode), the PCLK1 frequency
(I2C peripheral input clock) must be a multiple of 10 MHz */
//#define FAST_I2C_MODE
#ifdef FAST_I2C_MODE
#define I2C_SPEED 340000
#define I2C_DUTYCYCLE I2C_DutyCycle_16_9
#else
#define I2C_SPEED 100000
#define I2C_DUTYCYCLE I2C_DutyCycle_2
#endif /* FAST_I2C_MODE*/

void i2c_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
//         I2C_InitTypeDef  I2C_InitStructure;
        /* Enable I2C1 clock */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
       
        /* Configure TIM1 CH1 pin (PE9) as alternate function */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6 |  GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
       
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        SDAH;
        SCLH;
        RESETH;
}

void SDA(int i)
{
        if(0){
                GPIO_InitTypeDef GPIO_InitStructure;
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
        }
        else{
                GPIO_InitTypeDef GPIO_InitStructure;
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
        }
}

//延时
static void I2C_delay(void)
{
    uint8_t i=50;
    while(i)
    {
        __NOP();
        i--;
    }
}

//开始
static void I2C_Start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号  
{     
        SDAH;
        I2C_delay();
        SCLH;  
        I2C_delay();  
        SDAL;  
        I2C_delay();  
        I2C_delay();
        I2C_delay();
        SCLL;
        I2C_delay();
}
//停止
static void I2C_Stop(void)
{
        SDAL;
        I2C_delay();
        I2C_delay();
        SCLH;
        I2C_delay();
        I2C_delay();
        SDAH;
        I2C_delay();
        I2C_delay();
        I2C_delay();
}
//写
static void Writebyte(uint8_t frame)
{
        uint8_t i;
        for(i=0; i<8; i++) {
                if((frame << i) & 0x80)
                        SDAH;
                else
                        SDAL;
                I2C_delay();
                I2C_delay();
                SCLH;
                I2C_delay();
                I2C_delay();
                I2C_delay();
                SCLL;
                I2C_delay();
        }
}
//读
static uint8_t Readbyte(void)
{
        uint8_t ReadDate;
        uint8_t i;
        SDA(1);
        SDAH;
        for(i = 0; i < 8; i++) {
                I2C_delay();
                I2C_delay();
                SCLH;
                I2C_delay();
                ReadDate <<= 1;
                if(SDA_READ)
                        ReadDate += 1;
                I2C_delay();
                I2C_delay();
                SCLL;
                I2C_delay();
        }
        SDA(0);
        return ReadDate;
}

//等待应答
static int I2C_WaitAck(void)
{
//         SDA_IN;
//         SDAH;
        I2C_delay();
        I2C_delay();
        SCLH;
        I2C_delay();
        if(SDA_READ != 0) {
//                 rt_kprintf("%d\n", SDA_READ);
                I2C_delay();
                I2C_delay();
                SCLH;
//                 return -1;
        }
        I2C_delay();
        I2C_delay();
        SCLL;
        I2C_delay();
//         SDA_OUT;
        return 0;
}

//应答
static void I2C_Ack(void)
{
        SDAL;
        I2C_delay();
        I2C_delay();
        SCLH;
        I2C_delay();
        I2C_delay();
        I2C_delay();
        SCLL;
        I2C_delay();
}

//不应答
static void I2C_NoAck(void)
{
        SDAH;
        I2C_delay();
        I2C_delay();
        SCLH;
        I2C_delay();
        I2C_delay();
        I2C_delay();
        SCLL;
        I2C_delay();
}

//写数据  date(0~16基本为线性调节)
void WriteAD5274(uint8_t Command, uint16_t data)
{
        uint8_t frame1,frame2,frame3;
        frame1 = ADDR;
        frame3 = (data & 0xff);
        frame2 = (Command << 2) | ((data >> 8) & 0x03);
        rt_kprintf("0x%x  0x%x  0x%x\n", frame1, frame2, frame3);
         
        I2C_Start();
         
        Writebyte(frame1);
        I2C_WaitAck();
       
        Writebyte(frame2);
        I2C_WaitAck();
       
        Writebyte(frame3);
        I2C_WaitAck();
       
        I2C_Stop();
       
//         rt_thread_delay(35);
}
FINSH_FUNCTION_EXPORT(WriteAD5274, uint8_t Command uint16_t data);

//读数据
uint16_t ReadFromAD5274(uint8_t Command)
{
        uint8_t frame1, frame2, frame3;
        uint16_t data = 0;
        uint16_t ReadDate;
        frame1 = ADDR;
        frame3 = (data&0xff);
        frame2 = (Command << 2) | ((data >> 8) & 0x03);
       
        I2C_Start();
       
        Writebyte(frame1);
        I2C_WaitAck();
        Writebyte(frame2);
        I2C_WaitAck();
        Writebyte(frame3);
        I2C_WaitAck();
       
        I2C_Stop();
       
        I2C_Start();
       
        Writebyte((frame1+1));
        I2C_WaitAck();
        ReadDate = Readbyte();
        I2C_Ack();
        ReadDate <<= 8;
        ReadDate |= Readbyte();
        I2C_NoAck();
       
        I2C_Stop();
        rt_kprintf("ReadDate: 0x%04x\n", ReadDate);
        return  ReadDate&0x03ff;
}
FINSH_FUNCTION_EXPORT(ReadFromAD5274, set uint8_t Command);

void I2C_Reset(void)
{
        RESETL;
        I2C_delay();
        RESETH;
}
FINSH_FUNCTION_EXPORT(I2C_Reset, );





-----抵制A莫这个烂货!-----
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-12
在线时间
13 小时
发表于 2016-6-14 09:14:41 | 显示全部楼层
18019541212 发表于 2016-6-13 15:35
这是我的I2C读写AD5274写正常,读有点问题
------------------------------------------------

能解释下你是怎么实现电位器功能的吗?还有你的程序是怎么写的吗?我也在写电位器,不是很懂
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-6-2
在线时间
43 小时
发表于 2016-6-14 10:56:04 | 显示全部楼层
新手学编程 发表于 2016-6-14 09:14
能解释下你是怎么实现电位器功能的吗?还有你的程序是怎么写的吗?我也在写电位器,不是很懂

多看AD手册
-----抵制A莫这个烂货!-----
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-6-12
在线时间
13 小时
发表于 2016-6-14 11:00:37 | 显示全部楼层

看了呢  能将你完整的程序给我看一下吗?我参考参考
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-6-2
在线时间
43 小时
发表于 2016-6-15 09:53:05 | 显示全部楼层
这就是完整的啊,看不懂?
-----抵制A莫这个烂货!-----
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 14:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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