新唐单片机模拟IIC
新唐单片机模拟IIC读写INA220
*TPA626可做INA220的国产替代,一样可以用
#define SCL PA0
#define SDA PA1
#define NACK 1
#define ACK 0#define INA220_CONFIG_REGISTER 0x00
#define INA220_SHUNT_VOLTAGE_REGISTER 0x01
#define INA220_BUS_VOLTAGE_REGISTER 0x02
#define INA220_POWER_REGISTER 0x03
#define INA220_CURRENT_REGISTER 0x04
#define INA220_CALIBRATION_REGISTER 0X05
//配置引脚
void anolog_iic_init(void)
{GPIO_SetMode(PA, BIT0, GPIO_PMD_OUTPUT);GPIO_SetMode(PA, BIT1, GPIO_PMD_QUASI);
}
//iic起始信号
void anolog_iic_start(void)
{SCL = 1;SDA = 1;TIMER_Delay(TIMER3,4);SDA = 0;TIMER_Delay(TIMER3,4);SCL = 0;
}
//iic停止信号
void anolog_iic_stop(void)
{SCL = 0;SDA = 0;TIMER_Delay(TIMER3,4);SCL = 1;TIMER_Delay(TIMER3,4);SDA = 1;
}
//等待应答
uint8_t anolog_iic_wait_ack(void)
{uint8_t i = 0;SDA = 1;TIMER_Delay(TIMER3,4);SCL = 1;TIMER_Delay(TIMER3,4);while(SDA){i++;DEBUG("wait %d ...\n",i);if(i > 250){anolog_iic_stop();return NACK;}}SCL = 0;TIMER_Delay(TIMER3,4);return ACK;
}
//主机发送NACK应答
void anolog_iic_send_nack(void)
{SCL = 1;SDA = 1;TIMER_Delay(TIMER3,4);SCL = 0;SDA = 1; //更新:释放SDA,不然连续读可能出错
}
//主机发送ACK应答
void anolog_iic_send_ack(void)
{SCL = 1;SDA = 0;TIMER_Delay(TIMER3,4);SCL = 0;SDA = 1; //更新:释放SDA,不然连续读可能出错
}
//iic往从机写一个字节
void anolog_iic_send_byte(uint8_t byte)
{uint8_t i = 0;DEBUG("iic send 0x%02x\n",byte);for(i = 0; i<8; i++){SCL = 0;TIMER_Delay(TIMER3,4);if(byte&(1<<(7-i)))SDA = 1;elseSDA = 0;TIMER_Delay(TIMER3,4);SCL = 1;TIMER_Delay(TIMER3,4);}SCL = 0;SDA = 1;
}
//iic从从机读一个字节
uint8_t anolog_iic_read_byte(uint8_t ack_flag)
{uint8_t i = 0, data = 0;SDA = 1;SCL = 0;TIMER_Delay(TIMER3,4);for(i = 0; i<8; i++){SCL = 1;TIMER_Delay(TIMER3,4);data <<=1;data |= SDA;TIMER_Delay(TIMER3,4);SCL = 0;TIMER_Delay(TIMER3,4);}if(ack_flag == ACK)anolog_iic_send_ack();elseanolog_iic_send_nack();DEBUG("iic read 0x%02x\n",data);return data;
}
//写anolog_iic_start();anolog_iic_send_byte(slave_addr<<1);if(ACK != anolog_iic_wait_ack())return;anolog_iic_send_byte(INA220_CONFIG_REGISTER);if(ACK != anolog_iic_wait_ack())return;anolog_iic_send_byte(ina220_config_data[0]);if(ACK != anolog_iic_wait_ack())return;anolog_iic_send_byte(ina220_config_data[1]);if(ACK != anolog_iic_wait_ack())return;anolog_iic_stop();anolog_iic_start();anolog_iic_send_byte(slave_addr<<1);if(ACK != anolog_iic_wait_ack())return;anolog_iic_send_byte(INA220_CALIBRATION_REGISTER);if(ACK != anolog_iic_wait_ack())return;anolog_iic_send_byte(ina220_calibration_data[0]);if(ACK != anolog_iic_wait_ack())return;anolog_iic_send_byte(ina220_calibration_data[1]);if(ACK != anolog_iic_wait_ack())return;anolog_iic_stop();
//读anolog_iic_start();anolog_iic_send_byte(slave_addr<<1);if(ACK != anolog_iic_wait_ack())return -1;anolog_iic_send_byte(reg_addr);if(ACK != anolog_iic_wait_ack())return -1;anolog_iic_start();anolog_iic_send_byte((slave_addr<<1)|0x01);if(ACK != anolog_iic_wait_ack())return -1;val = anolog_iic_read_byte(ACK);//if(ACK != anolog_iic_wait_ack())// return -1;val = (val<<8) + anolog_iic_read_byte(NACK);
更新1:
主机应答最后添加:SDA = 1; //释放SDA,不然连续读可能出错
新唐单片机模拟IIC相关推荐
- m031开发 新唐_【M031LC2AE价格_新唐单片机M031LC2AE,M031LD2AE,32/64/128kFLASH,48pin_全速装置图片】-TG工业网...
新唐单片机M031LC2AE,M031LD2AE,32/64/128k FLASH,48pin 主要特色: • 运作特性 - 工作电压: 1.8V ~ 3.6V - 工作温度: -40°C ~ +10 ...
- 单片机单口不可用或被占用_新唐单片机代码评审总结
昨晚上,我们一个同事组织了一个小会议,大家一起讨论了一个项目的单片机代码,这个单片机用的是新唐单片机,期间大家也讨论了一些问题,总结一下,希望对写单片机的同学们有帮助. 我这个同事写的代码非常优秀,具 ...
- 新唐单片机 ICP 史上最全教程
新唐单片机 ICP 史上最全教程 新唐单片机 ICP烧录教程 目录 新唐单片机 ICP 史上最全教程 1.ICP软件安装 2.连接设备 3.设备供电 4.开启软件 5.欢迎界面 6.补充事项 7.建立 ...
- idata 单片机 新唐_新唐单片机代码评审总结
昨晚上,我们一个同事组织了一个小会议,大家一起讨论了一个项目的单片机代码,这个单片机用的是新唐单片机,期间大家也讨论了一些问题,总结一下,希望对写单片机的同学们有帮助. 我这个同事写的代码非常优秀,具 ...
- 新唐单片机选型手册_新唐单片机选型手册_新唐8051标准系列单片机选型指南
新唐8051标准系列单片机选型指南 新唐单片机 8位单片机 作者: 来源: 发布时间:2019-06-18 22:15:07 浏览:351 新唐科技标准8051产品系列,其管脚兼容于传统12T 8 ...
- 新唐单片机选型手册_新唐8051标准系列单片机选型指南
新唐8051标准系列单片机选型指南 新唐单片机 8位单片机 作者: 来源: 发布时间:2019-06-18 22:15:07 浏览:351 新唐科技标准8051产品系列,其管脚兼容于传统12T 8 ...
- 新塘单片机烧写器_新唐单片机软件加密|新唐单片机软件(NuConsole) v2.04.6725官方版 附安装教程_星星软件园...
NuConsole是一款实用的新唐单片机软件,该软件可以通过SWD接口操作,为用户提供不中断目标芯片和主机的信息传输机制,是机械和电气领域不可或缺的软件.软件简洁实用.操作简单.极易使用,需要的朋友赶 ...
- 新唐单片机如何生成精确延迟
最近在搞新唐单片机,所以记录下这部分内容. 之前的相关文章 呵,你会51单片机的精确延时吗? 假如使用者想要产生精确的延迟时间,建议使用 __nop() 函数来组合达成.__nop() 函数能够产生 ...
- 单片机入门学习笔记6:新唐单片机N76E003
学习新唐单片机是从2018年3月开始的,之前一点也不懂这一块单片机,之后脉络变的越来越清晰. 由于N76E003档次太低,新塘科技官方的管脚配置,芯片选型--都没有这一块芯片,资料唯独只有:芯片的数据 ...
最新文章
- 《暗时间》前两篇的笔记和总结
- ARC 100 C - Linear Approximation题解---三分法
- 如何在pycharm添加扩张工具
- 分布式认证方案-基于session的认证方式
- Kubernetes 无法删除pod实例的排查过程
- java中 immutable,future,nio
- ssh 与 locale
- element-ui cascader 级联选择器 存最后一级id及回显
- php之防注入程序绕过浅谈
- oracle删除数据库中的所有数据的拼接语句
- 后现代婚礼机器人显神通_机器人+无人机 江西新余智能消防显“神通”
- Android请求麦克风权限+系统权限页面回调
- 快速了解Redis、Cachecloud集群的搭建及管理
- 引用腾讯地图时出现”鉴权失败,请传入正确的key“
- C#笔试面试宝典值得收藏1
- 新手入门,想用VB给班上写一个自动播放上下课铃声的程序,求教
- 回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测
- 笔记:新手SEOer必备的WordPress优化插件
- html5绘制图形渐变-径向渐变
- 为什么点开桌面计算机那这么慢,电脑桌面刷新反应很慢怎么办?电脑桌面刷新很慢解决方法...
热门文章
- OpenStack 应答文件简单翻译
- 氚云CRM管理员手册
- 自动化测试之 web - 基础篇
- 惠普LaserJet M1216nfh MFP激光打印机开机提示“安装黑色碳粉盒”亮黄灯
- 计算机绘图要学吗,如何学好计算机绘图 AUTOCAD 软件
- 计算机组成原理学习之路(一)——数据表示
- 360 || 2021校园招聘的一道笔试题思路分享
- Unity-ShaderGraph学习笔记第一步: 如何打开ShaderGraph 制作全息效果Shader
- Toad 所有 菜单说明(太多)
- 牛客华为机试题刷题笔记总结[103题更新完毕才收尾,建议关注收藏]