tiny6410的IIC裸机驱动

蓝桥杯单片机模块代码(PCF8591)(代码+注释) 蓝桥杯电子类单片机 2022年备赛 南京信息工程大学 代码 注释 阅读详情

  IIC即Inter-IntegratedCircuit(集成电路总线),是一种多向控制总线,由飞利浦半导体公司在八十年代初设计,主要是用来连接整体电路(ICS)。在IIC中,多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源,这种方式简化了信号传输总线。I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

 一IIC协议

   IIC的总线协议规定:从设备采用7位地址,D7~D1作为从设备的地址,D0作为数据传输方向(0表示主设备向从设备写入数据,1表示主设备想从设备读出数据)。每次主设备广播出去的地址,所有从设备都会接收到并和自己的地址进行比对。IIC的从设备地址分为固定部分和用户自定义部分,D7~D4由厂商生产时就已经确定,D3~D1有用户自己确定,这里的实验是在IIC上挂载AT24C02(eeprom),其D3~D1接地,由其芯片手册以确定其读取地址为0xa1,发送地址为0xa0。

    IIC发送过程主要有三个重要阶段:

   发送:在时钟线SCL保持高电平期间,数据线SDA上的电平被拉低时为开始信号。


  结束:在时钟线SCL保持高电平期间,数据线SDA上的电平被释放,被拉高时为结束信号


应答:发送器每发送一个字节,就在时钟脉冲的第9位释放数据线,由接收器反馈一个应答信号,应答信号为低电平是定义为有效。



  二 IIC编程实现

  IIC的编程实验分为四部分,分别是iic初始化,读/写和测试。

相关寄存器:

IICCON:该寄存器主要涉及到IIC的应答信号是能(bit7),以及SCL的时钟频率(bit6和bit[3:0])。bit6确定其分频系数,由于SCL的频率规定为小于1000KHz,所以这次实验中IICCLK = PCLK /16,bit[3:0]确定最终的值,这次实验中bit[3:0]的值为0xf,所以最终频率值为IICCLK/(IICCON[3:0]+1).
计算公式:(PCLK=66.5Hz)

IICCLK = PCLK /16;

Tx clock = IICCLK/(IICCON[3:0]+1).=66.5/(16*16)*1M=255859.375HZ.

IICSTAT:该寄存器的bit[7:6]确定主从机的工作模式,bit[4]使能串行输出


IICDS:发送或者接受数据寄存器


初始化:结合s3c6410的操作手册,主要涉及到IIC相关寄存器的初始化和IIC数据线与时钟线的io初始化;


数据的发送这要结合芯片at24c02的数据手册和s3c6410的数据手册上的流程图


读数据:在结合流程图的同时要特别注意两个地方的操作,在图中以画出。


下面是本次实验的总代码:

#define IICDS (*(volatile unsigned char*)0x7F00400C)
#define IICSTAT (*(volatile unsigned char*)0x7F004004)
#define IICCON (*(volatile unsigned char*)0x7F004000)
//相关IO定义
#define GPBCON (*(volatile unsigned long*)0x7F008020)
#define GPBPUD (*(volatile unsigned long*)0x7F008028)
#define slavew_addr 0xa0//从机的发送地址
#define slaver_addr 0xa1//从机的接收地址
void delay(int timer)
{
int i;
while(timer--)
for(i=0;i<100;i++)
;
}
/*****
函数名:void IIC_init(void)
功能:初始化IIC相关的硬件
参数说明:无
返回值:无
时间:2017/7/11
*****/
void IIC_init(void)
{
//初始化中断相关寄存器()


//初始化相关IO
GPBCON |=(0x22<<20);
GPBPUD &=~(0xf<<9);
//1 如果需要将主机当作iic的从设备时,将其地址写入到IICADD中这里我们的cpu做主机所以不需要配置。

//2设置IICCON寄存器
//2.1 使能中断
IICCON |=(1<<5);
//2.2 定义SCL时钟(时钟频率小于1000khz)
IICCON &=~(1<<6);
IICCON &=~(0Xf<<0);
IICCON |=(0xf<<0);
//3设置IICSTAT为使能串行输出状态
IICSTAT |=(1<<4);
//应答信号的产生
IICCON |=(1<<7);
//清除相应的中断标志位,注意,这一位在接受或者发送完成时都要清零。
IICCON &=~(1<<4);
}
/*****
函数名:void IIC_read(unsigned char *buf,unsigned char daddr,int length)
功能:初始化IIC相关的硬件
参数说明:buf->存放接收到的数据,daddr读数据的地址,lengt读取数据的长度
返回值:无
时间:2017/7/11
*****/
void IIC_read(unsigned char *buf,unsigned char daddr,int length)
{
int j;
unsigned char unused;
//在eeprom芯片手册上有一段是写操作,所以这里要配置成主机发送模式
IICSTAT |=(0b10<<6);
//tab 写入从机地址
IICDS=slavew_addr;
IICCON &=~(1<<4);

IICSTAT=0xf0;

//tab2 等待应答-----发送完成产生中断,IICCON&(1<<4))==0表示数据发送完成
while((IICCON&(1<<4))==0)
{
delay(100);
}
//tab3 写入字节地址
IICDS=daddr;
//注意清除中断标志位
IICCON &=~(1<<4);
//tab4 等待应答
while((IICCON&(1<<4))==0)
{
delay(100);
}

//1 配置为主机接收模式
IICSTAT &=~(0b11<<6);
IICSTAT |=(0b10<<6);
//2 写入从机地址到IICDS
IICDS=slaver_addr;
IICCON &=~(1<<4);
//3 写入0X0B到IICSTAT
IICSTAT=0Xb0;
while((IICCON&(1<<4))==0)//在接收前会产生一次中断,如果该penging寄存器为1说明中断产生开始接收数据了
delay(100);
while((IICCON&(1<<4))==0)//在接收前会产生一次中断,如果该penging寄存器为1说明中断产生开始接收数据了
delay(100);
//不知道为什么,EEPROM每次在读数据时独到的第一个数据常常是无效数据,所以应该丢掉
unused=IICDS;
IICCON &= ~(1<<4);
//在接受数据前会产生中断所以这里需要等待中断的产生。
while((IICCON&(1<<4))==0)
delay(100);
//4 接受IICDS的数据(从机地址)的数据
for(j=0;j<length;j++)
{
//从eepro芯片手册观察到如果接受数据结束 ,最后会产生非应答信号。
if(j==(length-1))
IICCON &=~(1<<7);
buf[j]=IICDS;
//5 产生应答信号同时清楚相应的pending寄存器
IICCON &=~(1<<4);
while((IICCON&(1<<4))==0)//在接收前会产生一次中断,如果该penging寄存器为1说明中断产生开始接收数据了
delay(100);
}
//6 停止结接受数据,写入0X90到IICSTAT
IICSTAT=0x90;

//7 清楚pengding相应位
IICCON &= ~(1<<4);
//8 结束

}
/*****
函数名:void IIC_write(unsigned char sbuf,unsigned char daddr)
功能:IIC发送数据
参数说明:buf->存放要发送到的数据,daddr读数据的地址,lengt读取数据的长度
返回值:无
时间:2017/7/11
*****/
void IIC_write(unsigned char sbuf,unsigned char daddr)
{
//1主机发送模式
IICSTAT |=(0b10<<6);
//2 写从机地址到IICDS
IICDS=slavew_addr;
IICCON &= ~(1<<4);
//3 写入0xf0到IICSTAT
IICSTAT=0xf0;
//4 等待应答
while((IICCON&(1<<4))==0)//在接收前会产生一次中断,如果该penging寄存器为1说明中断产生开始接收数据了
delay(100);
//tab 写入字节地址
IICDS=daddr;
IICCON &= ~(1<<4);
//等待应答
while((IICCON&(1<<4))==0)//在接收前会产生一次中断,如果该penging寄存器为1说明中断产生开始接收数据了
delay(100);
//5 开始发送数据,一次发送一个字节
IICDS=sbuf;
IICCON &= ~(1<<4);
//5 等待应答并清除中断标志位
while((IICCON&(1<<4))==0)//在接收前会产生一次中断,如果该penging寄存器为1说明中断产生开始接收数据了
delay(100);
//6 写入0XD0到IICSTAT
IICSTAT=0xd0;
//7 清除中断标志位
IICCON &= ~(1<<4);
//8 等待结束
delay(100);
}

void IIC_test(void)
{
int i;
unsigned char sbuf[256];
unsigned char dbuf[256];
printf("befor read:---->\n");
for(i=0;i<256;i++)
{
sbuf[i] = i+1;
dbuf[i] = 0;
}
for(i=0;i<256;i++)
{
if(i%8==0)
printf("\r\n");
printf("dbuf[%d]=%d\t\t",i,dbuf[i]);
}
printf("there is dbug 1\n");
for(i=0;i<256;i++)
IIC_write(sbuf[i],i);
printf("after read:\n");
IIC_read(dbuf,0,256);
printf("there is dbug 2\n");
for(i =0; i<256;i++)
{
if(i%8==0)
printf("\r\n");

printf("%d\t",dbuf[i]);
}
}





第九届蓝桥杯单片机完整程序 本代码亲测有效,大家快来康康吧 阅读详情

相关推荐

第十届蓝桥杯单片机省赛程序题

第十届蓝桥杯单片机省赛真题,

qq_61672347的博客 2748

linux之I2C裸机驱动解析(转)

1硬件特性 1.1 概述 I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA)。由于I2C总线仅需要两根线,因此在电路板上占用的空间更少,带来的问题是带宽较窄。I2C在标准模式下传输速率最高100Kb/s,在快速模式下最高可达400kb/s。属于半双工。 在嵌入式系统中,I2C应用非常广泛,大多数微控制器中集成了I2C总线,一般用...

weixin_30443813的博客 174

Tiny6410裸机C程序

基于Tiny6410的无操作系统的裸机代码范例

蓝桥杯单片机—— PCF8591的基本原理及A/D转换应用(14)

一、原理分析 1、基本概念 PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。 I²C总线接口知识参考: (46条消息) 【蓝桥杯单片机进阶强化-01】IIC...

m0_57263863的博客 1万+

Tiny6410裸机开发源代码全集

目的:6410裸机学习程序,部份代码是移植网友的,仅供学习参考和交流 编译环境:XP SP3,RVDS2.2编译器 功能模块: 串口 、LED、beep(蜂鸣器)、key(查询和中断模式)、PWM、RTC、LCD、TOUCH(一线触摸) 、 nand、iic(AT24C08读取)、DS18B20(温度传感器)、利用定时器精确延时 程序烧录:位于out下的Bin文件,用SD卡(superboot)启动开发板用 [d] Download and Run an Absolute User Application把Bin文件加载到内存中运行,就可以调试了, 下载到nand flash还没有研究,参考友善手册的裸机开发demo SoftWare---裸机代码存放目录 build------RVDS2.2编译目录 out--------编译生成的bin文件目录 -------------------------------------------------------------- 其他目录为source insight 文件,可以删走

LTspice导入德州仪器SPICE模型的实用指南与常见问题解析

本文详细介绍了如何在LTspice中导入德州仪器的SPICE模型,包括模型文件获取、路径管理、导入步骤及常见问题解析。通过实用指南帮助工程师精确仿真电路性能,提升设计效率,重点涵盖了第三方模型的导入教程和最佳实践。

kk1234的博客 314

蓝桥杯突击7-AT24C02(使用蓝桥杯官方提供的库函数并且修正了错误)

学习CT107D上搭载的AT24C02(EEPROM)芯片: 比赛时虽然给出了IIC的驱动程序, 但是程序里面有点小错误, 里面的时序延时时间太短. 我们要将驱动库函数中的somenop改为如下: #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_no...

Beking17113的博客 1558

机器人视觉实战:用OpenCV搞定手眼标定(附完整C++代码)

本文详细介绍了使用OpenCV实现机器人视觉中的手眼标定技术,包括核心算法、工业场景优化及完整C++代码示例。通过解析坐标系转换问题,提供从数据采集到标定验证的全流程解决方案,帮助开发者在复杂工业环境中实现高精度机械臂与视觉系统的协同作业。

weixin_29306571的博客 482

Tiny6410裸机开发笔记(七)串口设置之输入输出字符

1. S3C6410 UART S3C6410 的 UART 提供了四个独立的异步串行 I / O (SIO)端口。每个异步串行 I/O(SIO)端口通过中断或者直接存储器存取(DMA)模式来操作。该 UART 使用系统时钟的时间可以支持的比特率最高为 115.2kb/s。每个UART 的通道包含了两个 64 字节收发 FIFO 存储器。 每个UART包含波特率发生器、发送器、接收器和控制单元,波特率发生器的时钟源可以由PCLK, EXT_UCLK0或EXT_UCLK1产生。发送器和接收器包含64字节FIF

fei.wan的博客 602

一文搞懂什么是OTA(空中升级)

OTA(Over-The-Air,空中升级)是一种通过无线通信技术实现远程更新设备固件或软件的方法。这项技术广泛应用于现代物联网(IoT)设备、智能手机、汽车、嵌入式系统等领域,提供了一种无需物理连接的便捷更新方式。OTA更新的核心在于使设备能够自动、可靠、安全地从远程服务器获取和应用更新,改善设备性能、添加新功能或修复安全漏洞。

不积跬步无以至千里 7万+

【Python 实战基础】如何绘制热力图来模拟绘制北京景区热度图

Python如何绘制热力图来模拟绘制北京景区热度图 文件读写 基础语法 字符串处理 文件生成 数据构建

菜鸟实战的博客 3403

蓝桥杯单片机实现温度、时间和ADC界面的转换

​ 1)通过DS18B20温度传感器,采集环境温度数据,保留小数点后2位有效数字。 2)读取DS1302时钟芯片的时、分、秒数据。 3)通过PCF8591芯片,采集光敏电阻返回的电压。 4)通过数码管显示时间、温度数据和电压,显示界面可以通过按键来回切换。 ​

ssjsjss的博客 1651

QT实现OPCUA服务端客户端(附完整源码)

QT实现OPCUA服务端客户端(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1824

蓝桥杯单片机第9届省赛程序题参考答案

蓝桥杯单片机第9届省赛程序题参考答案

因心,三人水的博客 1709

基于截图详解:SAP GUI for Java 如何设置登录链接,以及 conn= 连接字符串该怎么写

摘要:SAP GUI for Java 的连接属性配置关键是在"高级"页签的"conn="后填写连接字符串。连接字符串格式取决于网络拓扑:直连应用服务器使用"/H/主机/S/端口";通过消息服务器负载均衡使用"/M/消息服务器/S/端口/G/组名";经SAProuter访问则需添加路由器前缀。配置时需注意专家模式会覆盖其他页签设置,且连接字符串还支持附加参数如客户端、语言和默认事务码。具体填写内容应根据Basis团队提供的系统信

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 252

手把手教你完成YOLOv11 PySide6目标检测界面搭建,使用Qt6设计YOLOv11检测系统,前台系统+后台管理系统开发实战,可用于大论文凑工作量或毕设必备,全网最详细教程

目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。YOLO系列模型由于其高效的检测速度和较高的准确率,成为目标检测任务的首选算法之一。本项目结合 YOLOv11 与 PySide6,构建了一个图形化界面,便于用户进行目标检测的操作和展示,实现对图片、视频和摄像头的实时目标检测,不仅可以用于大论文的工作量展示,还可以作为毕业设计。系统功能有:目标检测程序实现图片/视频/摄像头检测,AI 问答界面(deepseek大模型接口,流式输出)、退出登录、界面保存登录状态、个人信息修改等

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 7015

IIC总线协议的原始驱动代码与其实例应用代码编写

原始驱动代码: //备注:该驱动代码针对8051芯片,晶振为12MHz的IIC驱动程序 #include "intrins.h" #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} //这里根据时钟大小需要适当修改_nop_();个数,比如针对stc15芯片,需要将_nop_();的个数乘上8 #define SlaveA...

hpf247的博客 1333

学Simulink--基础微电网场景实例:基于Simulink的微电网并网/孤岛无缝切换控制仿真

本文完成了基于 Simulink 的微电网并网/孤岛无缝切换控制仿真,实现了:✅ 构建含双模式逆变器的微电网模型✅ 实现预同步 + Stateflow 逻辑的智能切换✅ 验证计划与非计划切换的性能边界✅ 证明“无缝”在工程上是可实现的。

amy_mhd的博客 103

第九届蓝桥杯单片机省赛

第九届蓝桥杯单片机程序 创好程序直接复制粘贴就行,没那么多步骤。

m0_62431348的博客 1115

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

裸机IIC驱动(Linux驱动开发篇)

1.裸机驱动 单片机A和传感器B 没有借助linux内核的API来编写的,也就是裸机(单片机) 原理:A与B之间进行通信,我们需要编写驱动协议让A和B交流。其中编写驱动,分为主机驱动和设备驱动。其实二者可以合二为一成一个文件,但是为了迎合驱动的分离和分层的思想,才将其分开。这种思想的好处,请看我写的另外一篇文章Linux驱动的分离和分层。 好了,我们已经知道大致的步骤就是: 首先编写主机驱动(就是利用单片机A的各种寄存器)。然后再针对我们使用的传感器B编写一个驱动文件叫做设备驱动(借助主机驱动已经编写好的

栋哥修炼日记 1705

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

CT107D蓝桥杯IIC驱动通用所有单片机(7)

IIC驱动

HES_C的博客 1516

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Tiny6410裸机IIC读写EEPROM

一、S3C6410 IIC资源 由 IICCON、 IICSTAT、 IICDS 和IICADD 4个寄存器完成所有的操作。本实验中6410作为主机,因此只用到了前三个寄存器。IICADD只有在作为从机的时候才被用来存放从机的地址。 IICCON:bit[7]用于接收时的ACK使能, 在发送模式下该位不起作用 bit[6]用于...

weixin_43261234的博客 497

【蓝桥杯单片机】IIC通讯协议与EEPROM(AT24C02)(官方驱动源码改写)

实验开发板为CT107D蓝桥官方板,编译环境为MDK5 由蓝桥官方驱动改写 AT24C02: AT24C02为地址可编程器件(CT107D可编程位均为0),因此可于总线上挂载多个相同的器件。 最后一位为读写位(0写1读) IIC的开始和关闭时序图: 开始:数据线拉高,时钟拉高,数据线拉低,使产生下降沿。 结束:数据线拉低,时钟拉高,数据线拉高,使产生上升沿。 ...

永远年轻 永远热泪盈眶 2331

单片机比赛准备07-蓝桥杯-第五届初赛模拟题(模拟智能灌溉装置)

iic.h: #ifndef _IIC_H #define _IIC_H #include "intrins.h" #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} #define SlaveAddrW 0xA0 #define SlaveAddrR 0xA1 //总线引脚定义 sbit SDA = P2...

Vuko_Coding Zone 1002

解决opencv-python 安装缓慢问题

在搭建开发环境的过程和中,直接利用pip install opencv-python 安装,有时候会出现time out情况,所以采用镜像安装,这里也可以指定其他源。 pip install opencv-python -ihttps://pypi.tuna.tsinghua.edu.cn/simple

Linux_bin的博客 7214
上一篇: tiny6410的yaffs2文件系统的制作及其安装(2)
下一篇: 基于tiny6410的移动物体检测资料
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值