银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2019-02-16 | gingko | 初次建立 |
1. 在主界面选择File–>New Project 或者直接点击ACCEE TO MCU SELECTOR 2. 出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 3. 配置RCC,使用外部时钟源 4. 时基源选择SysTick 5. 将PA10,PB7,PB8设置为GPIO_Output 6. 引脚模式配置 7. 时钟源设置,选择外部高速时钟源,配置为最大主频 8. 工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 9. 点击Code Generator,进行进一步配置
I2C设备之间常用的连接方式如下图。
int main(void) { HAL_Init(); SystemClock_Config(); i2c.initialize(); axp152.initialize(); axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] axp152.set_dcdc2(1200);//[FPGA INT & PLL D] axp152.set_aldo1(2500);//[FPGA PLL A] axp152.set_dcdc4(3300);//[POWER_OUTPUT] axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] MX_GPIO_Init(); while (1) { } }
static int initialize(void) { __HAL_RCC_GPIOB_CLK_ENABLE(); SDA_OUTPUT; SCL_OUTPUT; SDA_ON; SCL_ON; return 0; } //起始信号 static int start(void) { SDA_ON; delay(); SCL_ON; delay(); SDA_OFF; delay(); SCL_OFF; delay(); SDA_OFF; delay(); SCL_OFF; delay(); return 0; } //终止信号 static int stop(void) { // SDA_OUTPUT; SDA_OFF; delay(); SCL_ON; delay(); SDA_ON; delay(); return 0; } //应答 static int ack(char a) { // SDA_OUTPUT; if (a) { SDA_OFF; }else { SDA_ON; } delay(); SCL_ON; delay(); SCL_OFF; delay(); return 0; }; //发送 static int write(unsigned char data) { unsigned char i = 8; // SDA_OUTPUT; for (i = 0; i < 8; i++) { /*要传送的数据长度为8 位*/ if ((data << i) & 0x80) SDA_ON; /*判断发送位*/ else SDA_OFF; delay(); SCL_ON; delay(); SCL_OFF; } SDA_INPUT; delay(); delay(); SCL_ON; delay(); if (SDA_DATA) i2c.ack_flag = 0; else i2c.ack_flag = 1; /*判断是否接收到应答信号*/ SCL_OFF; SDA_OUTPUT; delay(); return 0; } //接收 static unsigned char read(void) { unsigned char retc; unsigned char BitCnt; retc = 0; SDA_ON; /*置数据线为输入方式*/ SDA_INPUT; for (BitCnt = 0; BitCnt < 8; BitCnt++) { delay(); SCL_OFF; /*置时钟线为低,准备接收数据位*/ delay(); SCL_ON; /*置时钟线为高使数据线上数据有效*/ delay(); retc = retc << 1; if ((SDA_DATA) == 1) retc = retc + 1; /*读数据位,接收的数据位放入retc 中 */ delay(); } SCL_OFF; delay(); SDA_OUTPUT; return(retc); } //接受数据 static int read_nbyte(unsigned char sla, unsigned char suba, unsigned char *s, unsigned char no) { unsigned char i; i2c.start(); /*启动总线*/ i2c.write(sla); /*发送器件地址*/ // if(i2c.ack_flag==0)return(0); i2c.write(suba); /*发送器件子地址*/ // if(i2c.ack_flag==0)return(0); i2c.start(); i2c.write(sla + 1); // if(i2c.ack_flag==0)return(0); for (i = 0; i < no - 1; i++) { *s = i2c.read(); /*发送数据*/ i2c.ack(1); /*发送就答位*/ s++; } *s = i2c.read(); i2c.ack(0); i2c.stop(); return(1); } //发送数据 static int write_nbyte(unsigned char sla, unsigned char suba, unsigned char *s, unsigned char no) { unsigned char i; i2c.start(); i2c.write(sla); if (i2c.ack_flag == 0) return(0); i2c.write(suba); if (i2c.ack_flag == 0) return(0); for (i = 0; i < no; i++) { i2c.write(*s); if (i2c.ack_flag == 0) return(0); s++; } i2c.stop(); return(1); }
int initialize(void) { unsigned char ver; int rc; rc = i2c.read_nbyte(AXP152_I2C_ADDR,AXP152_CHIP_VERSION,&ver,1); if (rc){ return rc; } if (ver != 0x05){ return -1; } return 0; }
static unsigned char axp152_mvolt_to_target(int mvolt, int min, int max, int div) { if (mvolt < min) mvolt = min; else if (mvolt > max) mvolt = max; return (mvolt - min) / div; } int set_dcdc2(unsigned int mvolt) { unsigned char target = axp152_mvolt_to_target(mvolt, 700, 2275, 25); return i2c.write_nbyte(AXP152_I2C_ADDR,AXP152_DCDC2_VOLTAGE,&target,1);
用万用表测量各测试点电压与程序设定电压一致。