㈠ 单片机的I2C问题
兄弟,我一直用c来编程,很少用,汇编,给你一下建议吧。24c02,我印象中,页写是八个字节,写时先把单片机制为主机,再发start,再就是slave,即24c02的地址和写读信号,再就是数据要写的地址,最后是数据,这里的ack信号很重要啊,
我用的16,自带i2c接口,=================================================================
//=======ATmega16
//========7.3728MHZ
//==========24c02读写,显示
//================================================================
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#include "lcd.h"
#define uchar unsigned char
#define uint unsigned int
/**************************************************************************
* 函数名称: ERROR();
* 功 能: 蜂鸣器报错
* 参 数:无
* 描 述:PA0口置低可以鸣响蜂鸣器
**************************************************************************/
void ERROR()
{
uint i;
DDRA |= (1 << PA0);
PORTA &= ~(1 << PA0);
for( i = 0 ; i < 10000 ; i ++);
PORTA |= (1 << PA0);
}
//********************************************************************8
//*函数 向24c02发送一个字节
//*名称 wtwib();
//*参数 地址,数据
//*********************************************************************/
void wtwib(uchar ad,uchar da)
{ TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//发送start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWDR =da; //send the data to the bus
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
}
//=================================================================
//=======read a byte from 24c02
//========rtwib()
//==========need address
//================================================================
uchar rtwib(uchar ad)
{ uchar da;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x10)
ERROR();
TWDR = 0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x40)
ERROR();
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x58)
ERROR();
da = TWDR;
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
return da;
}
//========================================================
//====== send a page to the 24c02
//====== wtwis();
//=======need address and data and number;
//=========================================================
void wtwip(uchar ad,uchar n,uchar *da)
{ uchar i;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//发送start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
for(i=0;i<n;i++)
{ TWDR =da[i]; //send the data to the bus
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
}
//====================================================
//========read a string from the 24C02
//========rtwis();
//========need address,number
//=====================================================
void rtwis(uchar ad,uchar *p,uchar n)
{ uchar i;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x10)
ERROR();
TWDR =0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
for(i=0;i<n;i++)
{ TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x50)
ERROR();
p[i]=TWDR;
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
}
void main()
{ uchar a[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},i=0;
init_lcd();
TWBR = 0x1F;
TWSR = 0x02;
for(i=0;i<16;i++)
wtwib( i,a[i]); //单字节写
for(i=0;i<16;i++)
a[i]=0;
//rtwis(0x00,a,16);//连续读
for(i=0;i<16;i++) //单字节读
a[i]=rtwib( i);
for(i=0;i<16;i++)
send_d(a[i]+48);
㈡ 51单片机I2C总线读写程序这一步是什么意思啊
cy是进位标志,这些设置都是根据i2c总线的协议来写的,可以查查它的时序图理解下。
㈢ 哪些单片机具备I2C总线接口
IIC一般用模拟的较多,就是用普通IO口来模拟IIC时序,网上可以很容易找到相应的代码。但是有很多单片机还是有IIC硬件模块的,比如AVR系列的单片机是自带基于状态机的IIC模块。stm32也有IIC硬件模块。TI的msp430系列单片机也具有IIC模块。有IIC的的单片机有很多。你要选型的话建议你根据单片机的处理能力来选择,然后找到技术文档来查看是否有IIC接口。
㈣ 单片机如何一个I2C总线连接2个I2C器件
从地址一般是固化的(有些芯片可以通过硬件设定,但不可随意更改为你说的0或者11) 相同的从地址器件在同一I2C里面只能挂一个
㈤ 单片机i2c总线编程,
return 一旦执行,就退出函数了。
也就是说 如果flag==0 那么就return0 后面的就不执行了,退出函数
㈥ 单片机中的SPI,I2C,单总线,总线什么意思,什么用,什么区别,
嘿嘿 你提出的问题很多呀 我来帮你解答吧
1 先来回答你什么是总线:
总线就是一个公共的计算机的连接线 所有外围设备 都可以通过它与计算机相连接 是信息传递的通道 在它上面可以挂很多个外设元件。
2 总线的种类很多:
如芯片级的总线 如 SPI,I2C,单总线 近距离进行CPU与其它外围芯片的连接
他们多是采用串行方式传送 数据的 即一位一位传送数据 可以节省传送线的条数
SPI 需要3条线: 一条时钟线 一条数据接收线 一条数据发送线
I2C 需要2跳线 一条时钟线 一条 数据线
单总线 即是用一条数据线来通讯 如DS18B20数字温度传感器
还有RS-232 用于计算机和计算机或单片机进行数据通讯的
还有RS-485 、CAN等工业现场总线 用于远距离通讯 距离可达1000米。
3 总线的概念、种类、区别 都给你介绍了 呵呵 满意 就给加分啊
㈦ i2c单片机里什么意思
i2c是一种同步串行数字信号总线接口,用于实现多个器件或设备之间的通信。它包含有一根时钟线和数据线,最高通信速度可达400Kb/s.一些高档单片机带有该接口,但普通单片机可以用通用IO口模拟 i2c时序。
㈧ 最近刚学单片机一直搞不明白请单片机的I2C总线是什么怎么实现,需要单独的芯片来实现吗
它是一条总线,包括两条导线:一条数据线SDA,一条时钟线SCL。
单片机通过这条总线,和外接的各个芯片进行通信。
想传送一字节数据,就必须在数据线SDA上一位一位的传输;
每传送一位,在时钟线SCL上要输出一个脉冲。
另外还有“起始”、“终止”和“应答”位,这些看时序图即可理解。
总线上,可以挂接多个器件,这就有了“从地址”的问题;
在某个器件内部,可能有多个存储单元,这就有了“字地址”的问题。
I2C总线,确实是很罗嗦的。
㈨ 单片机的I2C问题
你要问什么
㈩ 在一个单片机上怎样实现连接两个i2c
不用分开。i2c是有器件地址的。8位地址,出去全0和全1的识别还可以挂载126个芯片