历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2021年10月14日 | STM32第九章-IIC通讯应用

发布者:等放假的Lwj 来源: eefocus关键字:STM32  IIC通讯  通讯协议 手机看文章 扫描二维码
随时随地手机看文章

  说到IIC(通常也叫I2C,其实都是一样的)通讯,是一种最简单的通讯协议。在学习STM32时第一个接触的就是串口USART通讯协议,接下来就是IIC通讯协议了还有的就是SPI协议,SPI我们下一章再说,这一章就说说IIC吧。很多模块都用到过IIC通讯,最常见的就是4针的0.96寸OLED显示屏,当然啦在学习STM32是我们一般最先接触到就是通过IIC来与EEPROM进行通讯,但是本章我们只讲协议本身。


一、 IIC 简介

  IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。


  I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。


  开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。


  结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。


  应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。这些信号中,起始信号是必需的,结束信号和应答信号都可以不要。

  IIC使用 SDA信号线来传输数据,使用 SCL信号线进行数据同步。SDA数据线在 SCL的每个时钟周期传输一位数据。传输时,SCL为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL为低电平时,SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。每次数据传输都以字节为单位,每次传输的字节数不受限制。


  如果我们直接控制STM32的两个GPIO 引脚,分别用作 SCL和SDA,按照上述信号的时序要求,直接像控制 LED 灯那样控制引脚的输出(若是接收数据时则读取 SDA电平),就可以实现 IIC通讯。同样假如我们按照 USART的要求去控制引脚,也能实现 USART通讯。所以只要遵守协议,就是标准的通讯,不管您如何实现它,不管是ST生产的控制器还是ATMEL生产的存储器, 都能按通讯标准交互。


  由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。相对地,还有“硬件协议”方式,STM32 的 IIC片上外设专门负责实现IIC通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理IIC协议的方式减轻了 CPU 的工作,且使软件设计更加简单。


二、通信特征:串行、同步、非差分、低速率

I2C属于串行通信,所有的数据以位为单位在SDA线上串行传输

同步通信就是通信双方工作在同一个时钟下,一般是通信的A方通过一根CLK信号线传输A自己的时钟给B,B工作在A传输的时钟下。所以同步通信的显著特征就是:通信线中有CLK。


非差分。因为I2C通信速率不高,而且通信双方距离很近,所以使用电平信号通信。


低速率。I2C一般是用在同一个板子上的2个IC之间的通信,而且用来传输的数据量不大,所以本身通信速率很低(一般几百KHz,不同的I2C芯片的通信速率可能不同,具体在编程的时候要看自己所使用的设备允许的I2C通信最高速率,不能超过这个速率)

突出特征 1:主设备+从设备(必须明确)

I2C通信的时候,通信双方地位是不对等的,而是分主设备和从设备。通信由主设备发起,由主设备主导,从设备只是按照I2C协议被动的接受主设备的通信,并及时响应。


谁是主设备、谁是从设备是由通信双方来定的(I2C协议并无规定),一般来说一个芯片可以只能做主设备、也可以只能做从设备、也可以既能当主设备又能当从设备(软件配置)。


有很多人认为在通信时单片机是主设备,器件是从设备,这是不严谨的。STM32单片机也可以当从设备,只是你没见到过罢了。


突出特征 2:可以多个设备挂在一条总线上(从设备地址)

I2C 通信可以一对一(1个主设备对1个从设备),也可以一对多(1个主设备对多个从设备)。

主设备来负责调度总线,决定某一时间和哪个从设备通信。注意:同一时间内,I2C 的总线上只能传输一对设备的通信信息,所以同一时间只能有一个从设备和主设备通信,其他从设备处于“冬眠”状态,不能出来捣乱,否则通信就乱套了。


每一个 I2C 从设备在通信中都有一个 I2C 从设备地址,这个设备地址是从设备本身固有的属性,然后通信时主设备需要知道自己将要通信的那个从设备的地址,然后在通信中通过地址来甄别是不是自己要找的那个从设备。(这个地址是一个电路板上唯一的,不是全球唯一的)

I2C 的总线空闲状态、起始位、结束位

I2C 总线上有 1 个主设备,n(n>=1)个从设备。I2C 总线上有 2 种状态;空闲态(所有从设备都未和主设备通信,此时总线空闲)和忙态(其中一个从设备在和主设备通信,此时总线被这一对占用,其他从设备必须歇着)。


整个通信分为一个周期一个周期的,两个相邻的通信周期是空闲态。每一个通信周期由一个起始位开始,一个结束位结束,中间是本周期的通信数据。


起始位并不是一个时间点,起始位是一个时间段,在这段时间内总线状态变化情况是:SCL 线维持高电平,同时 SDA 线发生一个从高到低的下降沿。


与起始位相似,结束位也是一个时间段。在这段时间内总线状态变化情况是:SCL 线维持高电平,同时 SDA 线发生一个从低到高的上升沿。


如何牢记IIC通信的起始信号和结束信号的时序?

  我们把IIC通信看做一条游荡在水中小船,把船面看成SDA数据线,水面波澜起伏看成IIC通信的时钟SCK,没有水船就不能走,同理没有时钟线就没有通信。因为SCL 维持高电平,SDA 线发生一个从高到低的下降沿起始信号就开始了,所以我们可以把船头当做起始信号(想象一下,在湖面上一条弯弯的小船在顺水而行)。同时SCL 维持高电平,SDA 线发生一个从低到高的上升沿就是停止信号,故我们可以把船尾看做停止信号(小船的船尾是不是与水面夹角为45°)。因此如果你记不住IIC通信的时序,请想象一下,你坐在一条小船上,顺水而下坐在船上拿着电脑写着IIC驱动程序就可以了。

I2C 数据传输格式(数据位&ACK)

每一个通信周期的发起和结束都是由主设备来做的,从设备只有被动的响应主设备,没法自己自发的去做任何事情。


主设备在每个通信周期会先发8位的从设备地址(其实8位中只有7位是从设备地址,还有1位表示主设备下面要写入还是读出)到总线(主设备是以广播的形式发送的,只要是总线上的所有从设备其实都能收到这个信息)。然后总线上的每个从设备都能收到这个地址,并且收到地址后和自己的设备地址比较看是否相等。如果相等说明主设备本次通信就是给我说话,如果不想等说明这次通信与我无关,不用听了不管了。


发送方发送一段数据后,接收方需要回应一个 ACK。这个响应本身只有1个 bit 位,不能携带有效信息,只能表示 2 个意思(要么表示收到数据,即有效响应;要么表示未收到数据,无效响应)。应答信号ACK只能是必须是接收方发送,因为只有发送方发送数据后接收方才能应答。


在某一个通信时刻,主设备和从设备只能有一个在发(占用总线,也就是向总线写),另在每个时钟的上升沿,把要发送的数据准备好,发送的才有效应答信号ACK只能是必须是接收方发送,因为只有发送方发送数据后接收方才能应答一个在收(从总线读)。如果在某个时间主设备和从设备都试图向总线写那就完蛋了,通信就乱套了。


数据在总线上的传输协议

I2C通信时的基本数据单位也是以字节为单位的,每次传输的有效数据都是1个字节(8位)。


起始位及其后的8个CLK中都是主设备在发送(主设备掌控总线),此时从设备只能读取总线,通过读总线来得知主设备发给从设备的信息;然后到了第9周期,按照协议规定从设备需要发送ACK给主设备,所以此时主设备必须释放总线(主设备把总线置为高电平然后不要动,其实就类似于总线空闲状态),同时从设备试图拉低总线后发出ACK。如果从设备拉低总线失败,或者从设备根本就没有拉低总线,则主设备看到的现象就是总线在第9周期仍然一直保持高,这对主设备来说,意味着我没收到ACK,主设备就认为刚才给从设备发送的8字节不对(接收失败)


二、 软件模拟协议

1.IIC初始化函数

功能:配置IIC的时钟线和数据线


void IIC_Init(void)

{      

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);    

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure); 

IIC_SCL=1;

IIC_SDA=1;

}


  因为是软件模拟IIC那么我们选择IIC通讯的引脚就相对来说说比较随意,具体使用的引脚可查阅《STM32F1xx 规格书》,以它为准。这里我们就选择PC11、PC12作为IIC的数据和时钟引脚。设置为推挽输出即可。

2.起始信号

功能: CPU发起I2C总线起始信号


void IIC_Start(void)

{

IIC_SDA=1;     

IIC_SCL=1;

delay_us(4);

  IIC_SDA=0;//START:当 CLK 为高电平时,DATA 从高到低改变

delay_us(4);

IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 

delay_us(4);

}


  起始信号产生后,所有从机设备就开始等待STM32紧接下来的从机地址信号。在IIC总线上,每个设备的地址都是唯一的,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据IIC协议,这个从机地址可以是 7位或10位。在地址位之后,是传输方向的选择位,该位为 0时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为 1时,则相反,即主机由从机读数据。


3.等待应答信号

功能:CPU 产生一个时钟,并读取器件的 ACK 应答信号


//返回值:1,接收应答失败  0,接收应答成功

u8 IIC_Wait_Ack(void)

{

u8 re;

IIC_SDA=1;delay_us(1);//CPU释放SDA总线    

IIC_SCL=1;delay_us(1);//CPU驱动SCL=1,此时器件会返回ACK应答

if(READ_SDA){//CPU读取SDA口线状态

   re=1;

}else{

  re=0;

}

IIC_SCL=0;//时钟输出0    

return re;  


  该函数用于 STM32 作为发送方时,等待及处理接收方传来的响应或非响应信号, 即一般调用前面的 IIC_SendByte 函数后,再调用本函数检测响应。


  STM32控制 SDA 信号线输出高阻态,释放它对 SDA的控制权,由接收方控制;控制 SCL 信号线切换高低电平,产生一个时钟信号,根据IIC协议,此时接收方若把 SDA 设置为低电平,就表示返回一个“应答”信号,若 SDA 保持为高电平,则表示返回一个“非应答 ”信号;在 SCL 切换高低电平之间,有个延时确保给予了足够的时间让接收方返回应答信号,延时后使用宏SDA_READ 读取 SDA 线的电平,根据电平值赋予 re 变量的值; 函数的最后返回 re的值,接收到响应时返回 0,未接收到响应时返回 1。当 STM32 作为数据接收端,调用 IIC_ReadByte 函数后,需要给发送端返回应答或非应答信号,此时可使用 IIC_Ack及 IIC_Nack 函数处理,该处理与 IIC_Wait_Ack函数相反,此时 SDA线也由 STM32控制。


4.应答信号

功能: CPU 产生一个 ACK 信号


//CPU产生一个ACK信号

void IIC_Ack(void)

{

IIC_SDA=0;//CPU驱动SDA=0

delay_us(2);

IIC_SCL=1;//CPU产生一个时钟

delay_us(2);

IIC_SCL=0;

delay_us(2);

IIC_SDA=1;//CPU释放SDA总线

}

//CPU产生1个NACK信号

void IIC_Nack (void)

{

IIC_SDA=1();//CPU驱动SDA=1

delay_us(2);

IIC_SDA=1;//CPU产生1个时钟

delay_us(2);

IIC_SCL=0;

delay_us(2);

}


  I2C 的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。作为数据接收端时,当设备接收到 I2C 传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接收到该信号后会产生一个停止信号,结束信号传输。


  代码的具体流程就是:根据要返回“应答”还是“非应答”信号,先准备好 SDA 线的电平,IIC_Ack函数中把 SDA 线设置为低电平,表示“应答”信号,IIC_Nack 函数中把 SDA 线设置为高电平,表示“非应答”信号;控制 SCL 线进行高低电平切换,产生一个时钟信号,在 SCL 线的高低电平之间加入一个延时,确保有足够的时间让通讯的另一方接收到 SDA信号线的电平;在 IIC_Ack 函数的末尾,响应信号发送结束后,重新把 SDA 线设置为高电平以释放总线的控制权,方便后续的通讯。


5.停止信号

功能:CPU 发起 I2C 总线停止信号


{

IIC_SDA=0;//STOP:当 CLK 为高电平时候, SDA出现一个上调表示IIC总线停止信号

IIC_SCL=1;

  delay_us(4);

IIC_SDA=1;//发送I2C总线结束信号    

}


  停止信号直接看是时序图就可以搞定了,在SCL和SDA都为低电平的情况下,首先把时钟线SCL拉高,再把数据线SDA拉高,IIC就会结束传输了。


  以上就是软件模拟IIC协议了,在平时的应用中我们实际上不需要掌握这些具体的代码,只要知道IIC协议的过程原理就行了,应为一般来说我们用的都是别人写好的代码,我们只需要会用就可以了,如果你的代码和我这些有出入也没有关系,只要能正常通讯即可,当然如果你的设计在过程中出现了一些问题,或者显示不正常,我们首先考虑的也不是底层协议的问题,而是你代码的其他问题。


6.IIC发送字节

功能: CPU向I2C总线设备发送8bit数据


void IIC_SendByte(u8 Byte)

{

u8 i;

/* 先发送字节的高位bit7 */

for (i = 0; i < 8; i++)

{

if (Byte & 0x80)

{

  IIC_SDA=1;

}

else

{

IIC_SDA=0;

}

i2c_Delay();

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

if (i == 7)

{

IIC_SDA=1;// 释放总线

}

Byte <<= 1; /* 左移一个bit */

delay_us(2);

}

}


  该函数以其输入参数作为要使用 I2C 协议输出的数据,该数据大小为一字节。函数的主体是一个 8 次的 for 循环,循环体执行一次将会对外发送一个数据位,循环结束时刚好发送完该字节数据。步骤分解如下:


  首先程序对输入参数Byte 和 0x80“与”运算,判断其最高位的逻辑值,为 1 时控制 SDA输出高电平,为 0则控制 SDA输出低电平;接下来 延时,以此保证 SDA 线输出的电平已稳定,再进行后续操作;之后控制 SCL线产生高低电平跳变,也就是产生 I2C协议中 SCL线的通讯时钟; 在 SCL线高低电平之间有个延时,该延时期间 SCL线维持高电平,根据 I2C协议,此时数据有效,通讯的另一方会在此时读取 SDA 线的电平逻辑,高电平时接收到该位为数据 1,否则为 0;就这样一次循环体执行结束,Byte 左移一位以便下次循环发送下一位的数据;如次循环 8 次,把Byte 中的 8 位个数据位发送完毕,在最后一位发送完成后(此时循环计数器 i=7),控制 SDA 线输出 1(即高阻态),也就是说发送方释放 SDA总线,等待接收方的应答信号。


7.IIC读取字节

功能: CPU从IIC总线设备读取8bit数据


u8_t IIC_ReadByte(void)

{

u8 i;

u8 value;

//读到第1个bit为数据的bit7

value = 0;

for (i = 0; i < 8; i++)

{

value <<= 1;

IIC_SCL=1;

delay_us(2);

if (DA_READ)

{

value++;

}

IIC_SCL=0;

delay_us(2);

}

return value;

}


  IIC_ReadByte 函数也是以 for 循环为主体,循环体会被执行 8次,执行完毕后将会接收到一个字节的数据,循环体接收数据的流程如下:


  首先使用一个变量 value 暂存要接收的数据,每次循环开始前先对 value 的值左移 1 位,以给 value 变量的 bit0 腾出空间,bit0 将用于缓存最新接收到的数据位,一位一位地接收并移位,最后拼出完整的 8位数据;然后控制 SCL线进行高低电平切换,输出 I2C 协议通讯用的时钟; 在 SCL 线高低电平切换之间,有个延时,该延时确保给予了足够的时间让数据发送方进行处理,即发送方在 SCL 时钟驱动下通过 SDA 信号线发出电平逻辑信号,而这个延时之后,作为数据接收端的 STM32 使用宏 SDA_READ读取 SDA信号线的电平,若信号线为 1,则 value++,即把它的 bit0置 1,否则不操作(这样该位将保持为 0),这样就读取到了一位的数据;接下来SCL线切换成低电平后,加入延时,以便接收端根据需要切换 SDA 线输出数据;直到循环结束后,value 变量中包含有 1 个字节数据,使用 return 把它作为函数返回值返回;


三、 硬件协议

  相对来说,硬件IIC直接使用外设来控制引脚,可以减轻 CPU 的负担。不过使用硬件IIC 时必须使用某些固定的引脚作为 SCL 和 SDA,软件模拟IIC则可以使用任意 GPIO 引脚,相对比较灵活。


  STM32的IIC外设可用作通讯的主机或从机,支持 100Kbit/s 和 400Kbit/s 的速率,支持 7位、10位设备地址,支持 DMA数据传输,并具有数据校验功能。它的IIC外设还支持 SMBus2.0协,SMBus 协议与IIC类似,主要应用于笔记本电脑的电池管理中。


  STM32 芯片有多个IIC外设,它们的IIC通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚,GPIO引脚的复用功能,可查阅《STM32F1xx 规格书》,以它为准。

在这里插入图片描述

IIC初始化函数

void IIC_init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;// 开漏输出 

GPIO_Init(GPIOA, &GPIO_InitStructure);

IIC_SCL=1;

IIC_SDA=1;//给一个停止信号, 复位I2C总线上的所有设备到待机模式

}


  因为是硬件IIC直接使用外设来控制引脚,那么我们选择IIC通讯的引脚就比较固定,具体使用的引脚可查阅《STM32F1xx 规格书》,以它为准。可以看到PB6和PB7两个引脚可以作为IIC的通讯引脚,而且PB6为SCL时钟线,而PB7则为SDA数据线,并设置为开漏输出。


  这里为啥设置为开漏输出的方式呢?


  这是由于使用的是软件模拟IIC方式,而IIC协议的 GPIO 必须的开漏输出模式,开漏输出模式在输出高电平时实际输出高阻态,当IIC该总线上所有设备都输出高阻态时,由外部的上拉电阻上拉为高电平。另外当 STM32 的 GPIO 配置成开漏输出模式时,它仍然可以通过读取GPIO 的输入数据寄存器获取外部对引脚的输入电平,也就是说它同时具有浮空输入模式的功能,因此在后面控制 SDA线对外输出电平或读取 SDA线的电平信号时不需要切换 GPIO的模式。


  另外在应交IIC协议之下,它的起始信号、等待应答信号、应答信号、停止信号都与软件模拟IIC协议之下的函数相同,在这里我就不重复说明了。

总结:IIC通讯协议很简单,在实际项目中我们不需要掌握具体的IIC协议代码,只要会用即可,作为最常见且常用的协议,我们最好能够背下来或者有所了解。现在IIC通讯不陌生了吧!

关键字:STM32  IIC通讯  通讯协议 引用地址:STM32第九章-IIC通讯应用

上一篇:STM32 Uart及其配置
下一篇:STM32-IIC通信(基于AT24C02的软件IIC通信)

推荐阅读

// 4412一共有5个window,每一个window可以设两个buffer// ALPHA   :决定是否半透明// COLOR KEY :决定是否显示// OSD :决定一个窗口的显示区域#include "regs.h"void enable_mmu(unsigned long ttb);void init_ttb(unsigned long *ttb_base);void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);vo...
搞过产品的朋友都有体会,一个设计看似简单,硬件设计和代码编写很快就搞定,但在调试过程中却或多或少的意外,这些都是抗干扰能力不够的体现。下面讨论一下如何让你的设计避免走弯路:抗干扰体现在2个方面,一是硬件设计上,二是软件编写上。这里重点提醒:在MCU设计中主要抗干扰设计是在硬件上,软件为辅。因为MCU的计算能力有限,所以要在硬件上花大工...
环境:主机:WIN10开发环境:MDK5.13MCU:STM32F103说明:本文定义了文本框控件。在gui中增加了字库支持后,就可以用文本框来显示字符。源代码:gui_widget_text.h/*** Copyright (c), 2015-2025* @file gui_widget_text.h* @brief 文本控件头文件* @author jdh* @date 2015/9/8*/ #ifndef _GUI_WIDGET_TEXT_H_#define _GUI_WIDGET_TEXT_H_ /***...
是德科技网络应用与安全总裁 Mark Pierpoint网络数据飞速增长,海量应用需要维护,技术飞速发展;这些都在促使网络的复杂性节节攀升。与此同时,网络犯罪分子也在不断升级他们的技术,从而抓住网络漏洞肆意妄为。了解网络流量的全部情况是确保高安全性和高性能的最佳方法。只有部分可视性的话,远远达不到足够的效果。加密、丢失或损坏的数据可能会导致...

史海拾趣

问答坊 | AI 解惑

access time的问题

型号是:EDD5116AGTA DQ output access time from CK, /CK tAC –0.7 0.7 –0.7 0.7 ns 2, 11 DQS output access time from CK, /CK tDQSCK –0.55 0.55 –0.55 0.55 ns 2, 11 DQS to DQ skew tDQSQ — 0.4 — 0.4 ns 3 看到这个实在无法理解, ...…

查看全部问答∨

半导体芯片焊接方法

半导体芯片焊接方法 芯片焊接(粘贴)方法及机理   芯片的焊接是指半导体芯片与载体(封装壳体或基片)形成牢固的、传导性或绝缘性连接的方法。焊接层除 了为器件提供机械连接和电连接外,还须为器件提供良好的散热通道。其方法可分为树 ...…

查看全部问答∨

WINCE5.0下蓝牙驱动问题

使用的蓝牙模块是UART接口的,要求生成的系统包含蓝牙驱动,可以使用控制面板中的BLUETOOTH设备属性进行蓝牙设备管理。 现在的问题是实现蓝牙驱动都需要选用哪些组件? …

查看全部问答∨

打开6410 WINCE6.0自带的CameraDshowApp.exe测试摄像头,发现我的3.5寸屏幕太小~造成有些选项显示不了

打开6410 WINCE6.0自带的CameraDshowApp.exe测试摄像头,发现我的3.5寸屏幕太小~造成有些选项显示不了: 哎~~~虚了~~ 1,这个CameraDshowApp.exe的窗体大小的应用程序在哪个目录下啊?我想改小点。。。。。 是这个WINCE600\\PRIVATE\\TEST\\MULT ...…

查看全部问答∨

获取时间问题

请给出程序的c代码实现 1.编写一个电子表程序,使其能够记录一天的24小时。 2扩展刚才编写的电子表程序,使其能够通过设定,改变为12小时显示和24小时显示。 3再次扩展刚才的电子表程序,使其能够记录日期,月份和年份,星期。 希望大家帮写一 ...…

查看全部问答∨

嵌入式

我很想知道嵌入式着 门专业4年后前景如何  ~!我现在是大一  ~!…

查看全部问答∨

请教啊

我是自动化的学生 以后想从事嵌入式系统开发方面的工作 学VC++有没有用啊 ?…

查看全部问答∨

linux(0.11)内核完全剖析, 碰到问题了

p18: 当计算机复位或开机时, cpu自动将cs设为0xf000, 则其段基址被设置为0xffff0000, 段长度64k, IP设置为0xfff0, 因此代码指针指向0xfffffff0. 问题是, 通过 段基址 + IP 就可以获得指令地址, 那CS在这里起什么作用那 P31: 由于BIOS把程 ...…

查看全部问答∨

WinCE500目录的问题

小弟想做一个WinCE5.0的usb串口驱动,在msdn上查到这么一段话 Porting the PXA27X USB Function Controller Driver PDD The PXA27X USB function controller driver is in %_WINCEROOT%\\Public\\Common\\OAK\\CSP\\ARM\\Intel\\PXA27X\\USBFN. T ...…

查看全部问答∨

线性调光控制器电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved