当前位置: 首页 > news >正文

网站建设管理规范外贸搜索推广

网站建设管理规范,外贸搜索推广,wordpress杂志主题,短链接生成器原理GPIO模拟I2C驱动的通用代码#xff0c;I2C的寄存器地址有8位和16位的#xff0c;主要解决了同一个MCU同时处理8位和16位寄存器地址芯片时候的驱动问题。 typedef enum {IIC_8BIT_BASE_ADDR,IIC_16BIT_BASE_ADDR }iic_bits_e; typedef struct {uint8_t DevAddr;uint16_t RegA…GPIO模拟I2C驱动的通用代码I2C的寄存器地址有8位和16位的主要解决了同一个MCU同时处理8位和16位寄存器地址芯片时候的驱动问题。 typedef enum {IIC_8BIT_BASE_ADDR,IIC_16BIT_BASE_ADDR }iic_bits_e; typedef struct {uint8_t DevAddr;uint16_t RegAddr;uint8_t data_len;uint8_t * data_buf;uint8_t bit_flag;uint16_t delay; }iic_param_t; 以上是结构体作为参数其中DevAddr是芯片地址RegAddr是寄存器地址data_len是写入或者读取的数据长度data_buf是写入或者读出的数据缓冲区bit_flag是寄存器位数IIC_8BIT_BASE_ADDR是8位IIC_16BIT_BASE_ADDR是16位。delay是根据需求读写数据时候的延时。根据芯片需求填写用不到就填0 下面是用法 写8bit寄存器 void bq27426_write_data(uint16_t reg, uint8_t * buf, uint8_t len) {iic_param_t bq27426 {BQ27426_DEV_ADDR,0,0,NULL,IIC_8BIT_BASE_ADDR,30};bq27426.RegAddr reg;bq27426.data_buf buf;bq27426.data_len len;simulate_i2c_writeblock(bq27426);} 写16bit寄存器 void cypd3176_write_data(uint16_t reg, uint8_t * buf, uint8_t len) {iic_param_t cypd3176 {CYPD3176_DEV_ADDR,0,0,NULL,IIC_16BIT_BASE_ADDR,0};cypd3176.RegAddr reg;cypd3176.data_buf buf;cypd3176.data_len len;simulate_i2c_writeblock(cypd3176); } 读8bit寄存器 void bq27426_read_data(uint16_t reg, uint8_t * buf, uint8_t len) {iic_param_t bq27426 {BQ27426_DEV_ADDR,0,0,NULL,IIC_8BIT_BASE_ADDR,30};bq27426.RegAddr reg;bq27426.data_buf buf;bq27426.data_len len;simulate_i2c_readblock(bq27426);} 读16bit寄存器 void cypd3176_read_data(uint16_t reg, uint8_t * buf, uint8_t len) {iic_param_t cypd3176 {CYPD3176_DEV_ADDR,0,0,NULL,IIC_16BIT_BASE_ADDR,0};cypd3176.RegAddr reg;cypd3176.data_buf buf;cypd3176.data_len len;simulate_i2c_readblock(cypd3176); } 下面是源码 #include stdio.h #include simulate.h#define PORT_I2C_SCL GPIOB #define PIN_I2C_SCL GPIO_Pin_6#define PORT_I2C_SDA GPIOB #define PIN_I2C_SDA GPIO_Pin_7#define simulate_IIC_SCL PBout(6) #define simulate_IIC_SDA PBout(7) #define simulate_READ_SDA PBin(7) static void i2c_Delay(void); static void i2c_PinModeOutput(void); static void i2c_PinModeInput(void); static void i2c_SCL(uint8_t stat); static void i2c_SDA(uint8_t stat); static uint8_t i2c_ReadSDA(void); static void i2c_Stop(void);iic_param_t simulate {simulate_ADDR,0,0,NULL,IIC_16BIT_BASE_ADDR,0 };static void i2c_Delay(void) {unsigned char t 3;while (t--); }static void i2c_PinModeOutput(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // ʹA˿ʱGPIO_InitStructure.GPIO_Pin PIN_I2C_SDA;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // ٶ50MHzGPIO_Init(PORT_I2C_SDA, GPIO_InitStructure); // ʼPA0,1 }static void i2c_PinModeInput(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // ʹA˿ʱGPIO_InitStructure.GPIO_Pin PIN_I2C_SDA;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; // GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // ٶ50MHzGPIO_Init(PORT_I2C_SDA, GPIO_InitStructure); // ʼPA0,1 }static void i2c_SCL(uint8_t stat) {if (stat){simulate_IIC_SCL 1;}else{simulate_IIC_SCL 0;} }static void i2c_SDA(uint8_t stat) {if (stat){simulate_IIC_SDA 1;}else{simulate_IIC_SDA 0;} }static uint8_t i2c_ReadSDA(void) {if (simulate_READ_SDA){return 1;}else{return 0;} }void i2c_Start(void) {i2c_PinModeOutput();i2c_SDA(1);i2c_Delay();i2c_SCL(1);i2c_Delay();i2c_SDA(0);i2c_Delay();i2c_SCL(0);i2c_Delay(); }void i2c_Stop(void) {i2c_PinModeOutput();i2c_SCL(0);i2c_SDA(0);i2c_Delay();i2c_SCL(1);i2c_Delay();i2c_SDA(1);i2c_Delay(); }void i2c_WriteByte(uint8_t _ucByte) {uint8_t i;i2c_PinModeOutput();i2c_SCL(0);i2c_Delay();for (i 0; i 8; i){if (_ucByte 0x80){i2c_SDA(1);}else{i2c_SDA(0);}_ucByte _ucByte 1;i2c_SCL(1);i2c_Delay();i2c_SCL(0);i2c_Delay();}i2c_SDA(1); }uint8_t i2c_ReadByte(void) {uint8_t i;uint8_t recv 0;i2c_PinModeOutput();i2c_SDA(1);i2c_Delay();i2c_PinModeInput();for (i 0; i 8; i){recv recv 1;i2c_SCL(1);i2c_Delay();if (i2c_ReadSDA()){recv | 0x01;}else{recv | 0x00;}i2c_SCL(0);i2c_Delay();}return recv; }void i2c_Ack(void) {i2c_PinModeOutput();i2c_SCL(0);i2c_SDA(0);i2c_Delay();i2c_SCL(1);i2c_Delay();i2c_SCL(0); }void i2c_NAck(void) {i2c_PinModeOutput();i2c_SCL(0);i2c_SDA(1);i2c_Delay();i2c_SCL(1);i2c_Delay();i2c_SCL(0); }uint8_t i2c_CheckAck(void) {uint8_t time 0;i2c_PinModeOutput();i2c_SDA(1);i2c_Delay();i2c_SCL(1);i2c_Delay();i2c_PinModeInput();while (i2c_ReadSDA()){time;if (time 100){return 1;}}i2c_SCL(0);return 0; }#define I2C_WR 0x00 #define I2C_RD 0x01 #define ACK 0 #define NOACK 1void simulate_i2c_init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7); }uint8_t iic_chip_select(iic_param_t *param, uint8_t rw_flag) {uint16_t i 0;if (param-data_len 40){return 0xf1;}if (param-data_buf NULL){return 0xF2;}for (i 0; i 3; i){i2c_Start();i2c_WriteByte((param-DevAddr 1) | rw_flag); if (i2c_CheckAck() ACK){break;}}if (i 3){i2c_Stop();return 0xf1;}return 0; }uint8_t simulate_i2c_writeblock(iic_param_t *param) {uint16_t i;if (0 ! iic_chip_select(param, I2C_WR)){return 0xF1;}if (IIC_16BIT_BASE_ADDR param-bit_flag){i2c_WriteByte((param-RegAddr 0xFF00) 8);if (i2c_CheckAck() NOACK){i2c_Stop();return 0xf7;}}i2c_WriteByte(param-RegAddr 0x00FF);if (i2c_CheckAck() NOACK){i2c_Stop();return 0xf3;}for (i 0; i param-data_len; i){i2c_WriteByte(param-data_buf[i]);if (i2c_CheckAck() NOACK){i2c_Stop();return 0xf4;}}i2c_Stop();for (i 0; i 100; i){i2c_Delay();}return 0; }uint8_t simulate_i2c_readblock(iic_param_t *param) {uint16_t i;int16_t j;if (0 ! iic_chip_select(param, I2C_WR)){return 0xF1;}/* 发送地址 */if (IIC_16BIT_BASE_ADDR param-bit_flag){i2c_WriteByte((param-RegAddr 0xFF00) 8);if (i2c_CheckAck() NOACK){i2c_Stop();return 0xf7;}}i2c_WriteByte(param-RegAddr 0x00FF);if (i2c_CheckAck() NOACK){i2c_Stop();return 0xf8;}if (0 ! iic_chip_select(param, I2C_RD)){return 0xF1;}for (i 0; i param-data_len - 1; i){for (j 0; j param-delay; j){i2c_Delay();}param-data_buf[i] i2c_ReadByte();for (j 0; j param-delay; j){i2c_Delay();}i2c_Ack();}for (j 0; j param-delay; j){i2c_Delay();}param-data_buf[param-data_len - 1] i2c_ReadByte();i2c_NAck();i2c_Stop();return 0; } #ifndef __IIC_DRIVER_H__ #define __IIC_DRIVER_H__#include sys.h #include stdlib.h #define simulate_ADDR (0x5F)typedef enum {IIC_8BIT_BASE_ADDR,IIC_16BIT_BASE_ADDR }iic_bits_e; typedef struct {uint8_t DevAddr;uint16_t RegAddr;uint8_t data_len;uint8_t * data_buf;uint8_t bit_flag;uint16_t delay; }iic_param_t;void simulate_i2c_init(void); uint8_t simulate_i2c_readblock(iic_param_t * param); uint8_t simulate_i2c_writeblock(iic_param_t * param);#endif 如果找不到PBout可用下面的头文件其他平台可以自己实现设置管脚的输入和输出模式替换掉文中的PBout PBin的接口 /* Includes ------------------------------------------------------------------*/ #ifndef __SYS_H #define __SYS_H #include stm32f10x.h#define BITBAND(addr, bitnum) ((addr 0xF0000000)0x2000000((addr 0xFFFFF)5)(bitnum2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))#define GPIOA_ODR_Addr (GPIOA_BASE12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE12) //0x4001180C #define GPIOF_ODR_Addr (GPIOF_BASE12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE12) //0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE8) //0x40010C08 #define GPIOC_IDR_Addr (GPIOC_BASE8) //0x40011008 #define GPIOD_IDR_Addr (GPIOD_BASE8) //0x40011408 #define GPIOE_IDR_Addr (GPIOE_BASE8) //0x40011808 #define GPIOF_IDR_Addr (GPIOF_BASE8) //0x40011A08 #define GPIOG_IDR_Addr (GPIOG_BASE8) //0x40011E08 #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) #define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) #define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) #define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) #define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) #endif
http://www.dnsts.com.cn/news/209745.html

相关文章:

  • 百度双站和响应式网站的区别ps免费素材网站有哪些
  • 南京网站关键词推广网站建设具体项目及价格
  • html 门户网站模板石家庄seo排名公司
  • 网站建设要不要工商注册网站导航html源码
  • 自己做网站卖东西可以做爰 网站
  • 个人主页网站制作教程网站模板使用
  • 福田区住房和建设局网站论坛网站开发中遇到的问题
  • saas建站工具网站提供什么服务
  • 有没有免费做企业网站的建设网站得目的
  • 企业网站做的好的有什么公司美耐皿 技术支持 东莞网站建设
  • 广州做网站如何装修设计网站源码
  • 做设计用哪个素材网站微商代理网
  • 淘宝网站内站建设网站建设技术代码
  • 瑞安做网站html模板素材
  • 建分类信息网站有哪些做的好的网站
  • 花溪区生态文明建设局网站重庆天蚕网络科技有限公司
  • 成都网站建设公司哪家好城乡建设和住房建设厅官网
  • 怎么制作网站准考证在网上打印vs2013做的网站
  • 网站万能密码修复wordpress后台cookies
  • 有经验的宁波网站建设wordpress 注册 用户名
  • 高端手机网站建设网站是公司资产
  • 东莞营销网站开发wordpress id重置密码忘记
  • 深圳网站建设黄浦网络 骗钱邯郸做网站网络公司
  • 负责网站建设沈阳建站模板源码
  • 做网站开发甲方一直要求p图网站改版的方式大致有
  • 网站首页 模板电子商务的就业方向是什么
  • 上海高端网站开发公汽车行业网站建设比较
  • 呼伦贝尔哪里做网站互联网行业发展现状
  • 西安网站建设孙正学默认网站停止
  • 怎么发现网站漏洞而做软件秦皇岛网站制作专家教您简单建站