历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2018年11月26日 | 【STM32 IIC详解】stm32 IIC从机模式(中断方式收发数据)

2018-11-26 来源:eefocus

1、IIC简介

 



第二节代码会用到该部分内容,对于IIC来说,从机是不能主动发送数据的,开始条件都是由主机生成。 


 


 


 


 


1.1、主机发送数据流程

 



  1) 主机在检测到总线为“空闲状态”(即 SDA、SCL 线均为高电平)时,发送一个启动信号“S”,开始一次通信的开始


  2) 主机接着发送一个命令字节。该字节由 7 位的外围器件地址和 1 位读写控制位 R/W组成(此时 R/W=0)


  3) 相对应的从机收到命令字节后向主机回馈应答信号 ACK(ACK=0)


  4) 主机收到从机的应答信号后开始发送第一个字节的数据


  5) 从机收到数据后返回一个应答信号 ACK


  6) 主机收到应答信号后再发送下一个数据字节


  7) 当主机发送最后一个数据字节并收到从机的 ACK 后,通过向从机发送一个停止信号P结束本次通信并释放总线。从机收到P信号后也退出与主机之间的通信


 


 


 


 


 


 


1.2、主机接收数据流程

 



  1) 主机发送启动信号后,接着发送命令字节(其中 R/W=1)


  2) 对应的从机收到地址字节后,返回一个应答信号并向主机发送数据


  3) 主机收到数据后向从机反馈一个应答信号


  4) 从机收到应答信号后再向主机发送下一个数据 


  5) 当主机完成接收数据后,向从机发送一个“非应答信号(ACK=1)”,从机收到ASK=1 的非应答信号后便停止发送


  6) 主机发送非应答信号后,再发送一个停止信号,释放总线结束通信


 


 


 


 


 


 


1.3、处理器的I2C模块会在如下所述的情况产生中断信号

 



  RX_UNDER   当处理器通过IC_DATA_CMD寄存器读取接收缓冲器为空时置位


  RX_OVER    当接收缓冲器被填满,而且还有数据从外设发送过来时被置位;缓冲器被填满后接收的数据将会丢失


  RX_FULL    当接收缓冲器达到或者超过IC_RX_TL寄存器中规定的阈值时被置位;当数据低于阈值时标志位将被自动清除


  TX_OVER    当发送缓冲器被填满,而且处理器试图发送另外的命令写IC_DATA_CMD寄存器时被置位


  TX_EMPTY   当发送缓冲器等于或者低于IC_TX_TL寄存器中规定的阈值时被置位;当数据高于阈值时标志位将被自动清除


  TX_ABRT    当i2c模块无法完成处理器下达的命令时被置位,有如下几种原因:


                          * 发送地址字节后没有从机应答


                          * 地址识别成功后主机发送的数据从机没有应答


                          * 当i2c模块只能作为从机时试图发送主机命令


                          * 当模块的RESTART功能被关闭,而处理试图完成的功能必须要RESTART功能开启才能完成


                          * 高速模块主机代码被应答


                          * START BYTE被应答


                          * 模块仲裁失败


                          无论标志位什么时候被置位,发送缓冲器和接收缓冲器的内容都会被刷新 


  ACTIVITY   表明i2c模块正在活动,这个标志位将会一直保持直到用以下4种方式清除:


                          * 关闭i2c


                          * 读取IC_CLR_ACTIVITY寄存器


                          * 读取IC_CLR_INTR寄存器


                          * 系统重启


  即使i2c模块是空闲的,这个标志仍然需要被置位直到被清除,因为这表明i2c总线上有数据正在传输

 

需要用到的:

 

  RD_REQ     当i2c模块作为从机时并且另外的主机试图从本模块读取数据时被置位  


  RX_DONE    当i2c模块作为从机发送数据时,如果主机没有应答则置位;这种情况发生在i2c模块发送最后一个字节数据时,表明传输结束


  STOP_DET   表明i2c总线上产生了STOP信号,无论模块作为主机还是从机


  START_DET  表明i2c总线上产生了START信号,无论模块作为主机还是从机


 


 


 


 


 


 


2、IIC从机中断收发函数

 



// 从机收发函数处理


void I2C1_EV_IRQHandler(void)


{


  __IO uint16_t SR1Register =0;


  __IO uint16_t SR2Register =0;



  SR1Register = I2C1->SR1;           // 通过读取 SR1/2 获取 IIC 状态


  SR2Register = I2C1->SR2;



  // 从机发送


  // 判断IIC是从机模式 - 最低位(MSL = 0)


  if((SR2Register & 0x0001) != 0x0001)


  {


    // ADDR:根据状态判断获取从机IIC地址成功


    if((SR1Register & 0x0002) == 0x0002)


    {


      // 清除标志,准备接收数据


      SR1Register = 0;


      SR2Register = 0;


 TrCount= 0;


    }



//TxE:根据状态标志可以发送数据


if((SR1Register & 0x0080) == 0x0080)


{


 SR1Register = 0;


      SR2Register = 0;


 I2C1->DR =TrCount ++;


}


//STOPF:监测停止标志


if((SR1Register & 0x0010) == 0x0010)


{


 I2C1->CR1 |= CR1_PE_Set;


      SR1Register = 0;


      SR2Register = 0;


 TrCount= 5;


}


//TIME_OUT


if((SR1Register & 0x4000) == 0x4000)


{


 I2C1->CR1 |= CR1_PE_Set;


 SR1Register = 0;


      SR2Register = 0;


}


  }  

  

  // IIC从机接收


  // 判断IIC是从机模式 - 最低位(MSL = 0)


  if((SR2Register &0x0001) != 0x0001)


  {


    // 收到主机发送的地址:(ADDR = 1: EV1) 


    if((SR1Register & 0x0002) == 0x0002)


    {


      // 清除标志,准备接受数据


      SR1Register = 0;


      SR2Register = 0;


      Rx_Idx = 0;


    }

    

    // 接收数据 (RXNE = 1: EV2)


    if((SR1Register & 0x0040) == 0x0040)


    {


      Buffer_Rx[Rx_Idx++] = I2C1->DR;


      SR1Register = 0;


      SR2Register = 0;


    }

    

    // 监测停止条件 (STOPF =1: EV4) 


    if(( SR1Register & 0x0010) == 0x0010)


    {


      I2C1->CR1 |= CR1_PE_Set;


      SR1Register = 0;


      SR2Register = 0;


      Flag_RcvOK = 1;                         


    }


  }


}


 


 


 


 


 


 


3、代码参考实例

 



//stm32f10x_it.c



#include "stm32f10x_it.h"


#include "stdio.h"



extern u32 BufferSize ;


extern u8 I2C1_ADDRESS ;


extern u8 I2C2_ADDRESS ;


extern vu8 I2C1_Buffer_Tx[];


extern vu8 I2C2_Buffer_Rx[];


vu32 Tx_Counter = 0;


vu32 Rx_Counter = 0;


vu32 show_counter1 = 0;


vu32 show_counter2 = 0;



// I2C1 作为主机,用于中断接收从机数据


void I2C1_EV_IRQHandler(void)


{


  show_counter1++;


  if(show_counter1 > 1000000)


  {


    show_counter1 = 0;


    printf("\r\n The I2C1 LastEvent is %x \r\n", I2C_GetLastEvent(I2C1));


  }


  switch(I2C_GetLastEvent(I2C1))


  {


    case I2C_EVENT_MASTER_MODE_SELECT: // 已发送启始条件


    {


 // 七位地址发送


      I2C_Send7bitAddress(I2C1, I2C2_ADDRESS, I2C_Direction_Receiver);


      printf("\r\n The I2C1 is ready \r\n");


      break;


    }


    case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: // 已发送从机地址


    {


      printf("\r\n The slave address is %x \r\n", I2C_ReceiveData(I2C1));


      break;


    }


    case (I2C_EVENT_MASTER_BYTE_RECEIVED | (I2C_FLAG_BTF & 0x0f)): // 第一个数据已接收


    {


      // 要接收最后一个字节前先关总线,不然总线锁死


      I2C_GenerateSTOP(I2C1,ENABLE);


      printf("\r\n The I2C1 has received data2 %x \r\n", I2C_ReceiveData(I2C1));


      printf("\r\n The I2C1 is finish \r\n");


      break;


    }


    case 0x40:


    {


      // 接收了两个同样的数据,没有这个释放不了 RXNE


      I2C_ReceiveData(I2C1);


    }


default: {break;}


  }


}



// I2C2 用于从机发送数据到主机


void I2C2_EV_IRQHandler(void)


{


  show_counter2++;


  if(show_counter2 > 100000)


  {


    show_counter2 = 0;


    printf("\r\n The I2C2 LastEvent is %x \r\n", I2C_GetLastEvent(I2C2));


  }


  switch(I2C_GetLastEvent(I2C2))


  {


    // 收到匹配的地址数据


    case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: 


    {


      printf("\r\n The I2C2 is ready \r\n");


      I2C_GenerateSTOP(I2C2, DISABLE);


      break;


    }


    case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: //发送数据


    {


      printf("\r\n The I2C2 transmits is transmitting \r\n");


      I2C_SendData(I2C2, 0xb6 + Rx_Counter); 


      break;


 


 


 


 


    }


 


   // 发送数据,要发送,不然锁死,不过 master 没收到


    case I2C_EVENT_SLAVE_BYTE_TRANSMITTED:


    {


      printf("\r\n The I2C2 transmits one byte \r\n");


     I2C_SendData(I2C2, 0xb6 + (Rx_Counter++));


      break;


    }


    case I2C_EVENT_SLAVE_STOP_DETECTED: //收到结束条件


    {


      printf("\r\n The I2C2 is finish \r\n");


      I2C_ClearFlag(I2C2,I2C_FLAG_STOPF);


      I2C_GenerateSTOP(I2C2, ENABLE);


      break;


    }


    default: {break;}


  }


}



/*----------------------------------------------------------------------------------------------------


名称: I2C 测试 24C02 测试


编写: mingzhang.zhao


内容:测试 stm32f103vct6 的硬件 I2C 实现中断收发数据


注意事项:


1.USART1: PA9 为 TX, PA10 为 RX


I2C1: PB6 为 SCL, PB7 为 SDA


I2C2: PB10 为 SCL, PB11 为 SDA


----------------------------------------------------------------------------------------------------*/


#include "stm32f10x.h"


#include "stdio.h"


#define PRINTF_ON 1


void RCC_Configuration(void);void GPIO_Configuration(void);


void USART_Configuration(void);


void I2C_Configuration(void);


void NVIC_Configuration(void);


void Delay(__IO uint32_t t);


u8 I2C1_ADDRESS = 0x30; //7 位 I2C 地址


u8 I2C2_ADDRESS = 0x31;


#define Size 4


vu8 I2C1_Buffer_Tx[Size] = {1,2,3,4};


vu8 I2C2_Buffer_Rx[Size] = {0};


u32 BufferSize = Size ;



int main(void)


{


  RCC_Configuration();


  GPIO_Configuration();


  USART_Configuration();


  I2C_Configuration();


  NVIC_Configuration();


  I2C_GenerateSTART(I2C1,ENABLE);


  while(1)


  {


    Delay(1000);


    I2C_GenerateSTART(I2C1,ENABLE); //I2C1 循环读取数据


  }


}



// 初始化和配置相关


void I2C_Configuration(void)


{


  I2C_InitTypeDef I2C_InitStructure;


  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;


  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;


  I2C_InitStructure.I2C_OwnAddress1 = I2C1_ADDRESS;


  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;


  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;


  I2C_InitStructure.I2C_ClockSpeed = 200000;I2C_Init(I2C1,&I2C_InitStructure);


  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;


  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;


  I2C_InitStructure.I2C_OwnAddress1 = I2C2_ADDRESS;


  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;


  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;


  I2C_InitStructure.I2C_ClockSpeed = 200000;


  I2C_Init(I2C2,&I2C_InitStructure);


  I2C_ITConfig(I2C1,I2C_IT_EVT|I2C_IT_BUF,ENABLE);


  I2C_ITConfig(I2C2,I2C_IT_EVT|I2C_IT_BUF,ENABLE);


  I2C_Cmd(I2C1,ENABLE);


  I2C_Cmd(I2C2,ENABLE);


}



void NVIC_Configuration(void)


{


  NVIC_InitTypeDef NVIC_InitStructure;


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


  NVIC_InitStructure.NVIC_IRQChannel = I2C1_EV_IRQn;


  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;


  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


  NVIC_Init(&NVIC_InitStructure);


  NVIC_InitStructure.NVIC_IRQChannel = I2C2_EV_IRQn;


  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;


  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;


  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;


  NVIC_Init(&NVIC_InitStructure);


}



void GPIO_Configuration(void)


{


  GPIO_InitTypeDef GPIO_InitStructure;


  //初始化 I2C1GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;


  GPIO_Init(GPIOB , &GPIO_InitStructure);


  //初始化 I2C2


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;


  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;


  GPIO_Init(GPIOB , &GPIO_InitStructure);


  //初始化 USART1


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


  GPIO_Init(GPIOA , &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


  GPIO_Init(GPIOA , &GPIO_InitStructure);


}



void RCC_Configuration(void)


{


  /* 定义枚举类型变量 HSEStartUpStatus */


  ErrorStatus HSEStartUpStatus;


  /* 复位系统时钟设置*/


  RCC_DeInit();


  /* 开启 HSE*/

 

 RCC_HSEConfig(RCC_HSE_ON);


  /* 等待 HSE 起振并稳定*/


  HSEStartUpStatus = RCC_WaitForHSEStartUp();


  /* 判断 HSE 起是否振成功,是则进入 if()内部 */


  if(HSEStartUpStatus == SUCCESS)


  {


  /* 选择 HCLK(AHB)时钟源为 SYSCLK 1 分频 */


  RCC_HCLKConfig(RCC_SYSCLK_Div1);


  /* 选择 PCLK2 时钟源为 HCLK(AHB) 1 分频 */


  RCC_PCLK2Config(RCC_HCLK_Div1);


  /* 选择 PCLK1 时钟源为 HCLK(AHB) 2 分频 */RCC_PCLK1Config(RCC_HCLK_Div2);


  /* 设置 FLASH 延时周期数为 2 */

 

 FLASH_SetLatency(FLASH_Latency_2);


  /* 使能 FLASH 预取缓存 */


  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


  /* 选择锁相环(PLL)时钟源为 HSE 1 分频, 倍频数为 9,则 PLL 输出频率为 8MHz


  * 9 = 72MHz */


  RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


  /* 使能 PLL */


  RCC_PLLCmd(ENABLE);


  /* 等待 PLL 输出稳定 */


  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);


  /* 选择 SYSCLK 时钟源为 PLL */


  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


  /* 等待 PLL 成为 SYSCLK 时钟源 */


  while(RCC_GetSYSCLKSource() != 0x08);


  }


  /* 打开 APB2 总线上的 GPIOA 时钟*/

  

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB


  2Periph_USART1, ENABLE);


  //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1|RCC_APB1Periph_I2C2,ENABLE);

  

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP|RCC_APB1Pe

 

 riph_WWDG|RCC_APB1Periph_SPI2, ENABLE);


}



void USART_Configuration(void)


{


  USART_InitTypeDef USART_InitStructure;


  USART_ClockInitTypeDef 

USART_ClockInitStructure;USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;

 

 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;


  USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;


  USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;


  USART_ClockInit(USART1 , &USART_ClockInitStructure);


  USART_InitStructure.USART_BaudRate = 9600;


  USART_InitStructure.USART_WordLength = USART_WordLength_8b;


  USART_InitStructure.USART_StopBits = USART_StopBits_1;


  USART_InitStructure.USART_Parity = USART_Parity_No;


  USART_InitStructure.USART_HardwareFlowControl =


  USART_HardwareFlowControl_None;


  USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;


  USART_Init(USART1,&USART_InitStructure);


  USART_Cmd(USART1,ENABLE);


}



void Delay(__IO uint32_t t)


{


  while(t--);


}


#if PRINTF_ON


int fputc(int ch,FILE *f)


{


  USART_SendData(USART1,(u8) ch);


  while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);


  return ch;


}


#endif


--------------------- 


作者:liwei16611 


来源:CSDN 


原文:https://blog.csdn.net/liwei16611/article/details/75258222 


版权声明:本文为博主原创文章,转载请附上博文链接!


推荐阅读

史海拾趣

Eclipse Magnetics公司的发展小趣事

由于篇幅限制,无法在此处直接提供5个完整的、每篇至少500字的Eclipse Magnetics公司电子行业发展的相关故事。不过,我可以概括地描述几个可能的故事线索,这些线索可以基于Eclipse Magnetics公司的历史、技术发展和市场应用来构建。

  1. 品牌初创与磁铁技术的突破

在1930年代,Eclipse Magnetics的名字首次出现,标志着这个品牌的诞生。随着技术的不断发展,公司在1940年代成为独立公司,并开始专注于磁铁技术的研发。到了1950年代,Eclipse Magnetics在技术上取得了重大突破,他们将磁铁涂上红色,并设计了与公司颜色相匹配的马蹄形标志,这一设计不仅提升了品牌形象,也成为了国际通用标记。这一时期的Eclipse Magnetics,以其独特的技术和产品,开始在电子行业中崭露头角。

  1. 航空航天领域的应用与拓展

随着航空航天技术的不断发展,Eclipse Magnetics看到了磁铁技术在该领域的巨大潜力。公司开始投入大量资源,研发适用于航空航天领域的磁性解决方案。通过不断的技术创新和产品优化,Eclipse Magnetics成功地为航空航天领域提供了高性能、高可靠性的磁铁产品,并在这一领域树立了良好的口碑。

  1. 与制药工业的深入合作

除了航空航天领域,Eclipse Magnetics还与制药工业建立了深入的合作关系。在制药过程中,磁铁技术可以用于磁选机,有效地去除原料中的杂质,提高药品的纯度。Eclipse Magnetics根据制药工业的特殊需求,定制了多款磁选机产品,并提供了全面的技术支持和售后服务。通过与制药工业的深入合作,Eclipse Magnetics不仅拓展了市场,也提升了自身的技术实力。

  1. 在汽车制造行业的应用

随着汽车制造业的快速发展,Eclipse Magnetics也看到了磁铁技术在该领域的广阔前景。公司针对汽车制造中的各个环节,研发了多款适用于不同场景的磁性解决方案。例如,在齿轮箱轴制造过程中,Eclipse Magnetics的磁性过滤器可以保持冷却液的清洁,提高生产效率和产品质量。这些解决方案不仅满足了汽车制造业的需求,也进一步巩固了Eclipse Magnetics在电子行业中的地位。

  1. 创新研发与可持续发展

作为一家专注于磁性技术的公司,Eclipse Magnetics始终将创新作为发展的核心动力。公司不断投入研发资源,推动磁铁技术的不断进步。同时,Eclipse Magnetics也关注可持续发展问题,致力于研发环保、高效的磁性产品。通过创新研发和可持续发展战略的实施,Eclipse Magnetics在电子行业中保持了领先地位,并为未来的发展奠定了坚实的基础。

请注意,以上内容仅为故事线索的概括描述,具体的故事细节和数据需要根据Eclipse Magnetics公司的实际情况进行补充和完善。

CSR plc(剑桥硅晶无线电)公司的发展小趣事

为了进一步拓展业务范围,CSR plc在2010年8月收购了专业音频压缩技术供应商APT。这次收购让CSR plc得以将APT-X的低延迟音频压缩编解码器与公司的下一代音频产品实现更紧密的集成,从而支持公司向前景更广阔的音频市场进军。这一举措不仅让CSR plc在音频领域取得了更大的市场份额,也为其未来的发展开辟了新的道路。

Aplus Integrated Circuits公司的发展小趣事

随着公司产品的不断优化和升级,Aplus Integrated Circuits开始寻求与国际市场的接轨。公司积极参与国际电子行业的交流与合作,与多家国际知名企业建立了稳定的合作关系。通过引进国外先进的技术和管理经验,公司的产品逐渐走向国际化,市场竞争力得到了进一步提升。

Aerovox Corporation公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些挑战,Aplus Integrated Circuits公司积极调整战略,加大研发投入,推动产品创新。公司成功开发出多款适应市场需求的新型集成电路产品,不仅满足了客户的多样化需求,还为公司带来了可观的收益。

Connective Peripherals Pte Ltd公司的发展小趣事

随着公司产品的不断优化和升级,Aplus Integrated Circuits开始寻求与国际市场的接轨。公司积极参与国际电子行业的交流与合作,与多家国际知名企业建立了稳定的合作关系。通过引进国外先进的技术和管理经验,公司的产品逐渐走向国际化,市场竞争力得到了进一步提升。

Cypress Industries公司的发展小趣事

Cypress在半导体制造领域一直处于技术革新的前沿。公司不断引入新的工艺技术,从早期的0.8微米CMOS技术到后来的0.21微米工艺,不断推动产品性能的提升。这种对技术的持续投入和追求,使Cypress在行业内树立了良好的技术形象,并赢得了客户的广泛认可。

问答坊 | AI 解惑

菜鸟共战ARM(LPC2131),实战篇(1)

早段时间,看了三星的4510.总算对ARM有所了解... 觉得学这种纯技术的东西,不可能在很短时间内看透澈.于是乎,我旦求一知半解...余下的一半在实际操作中慢慢领会... 简单说下这次的实战情况... 实战平台:周立功LPC213X开发板 实战内容:L ...…

查看全部问答>

请问:大学生和非大学生进入嵌入式领域的门槛有多少区别

我是一个大二学生,学校不是工科的,老师说我们的实践条件很差。。。不太清楚自己考上大学与那些没有进大学的朋友最后毕业后多掌握的到底是什么,还是压根就没有什么优势,除了一张文凭外,谢谢…

查看全部问答>

usb device驱动的问题

我的主板配置是pxa270+wce50,现在主板有个问题是usb device有点问题,MS activesync连接不上,通过查看PXA270的USBC_P,USBC_N两脚的信号,好像不对,但感觉查这两个信号也无法确定问题,其实USB device电路应该很简单,没有什么东西,但就是不通, ...…

查看全部问答>

winCE 下 CToolbar的位置如何改变?

我生成好的toolbar就在屏幕底部,我想改变位置,但是没有效果,高手帮忙一下? if (!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD  | WS_VISIBLE |CBRS_ALIGN_BOTTOM | CBRS_SIZE_DYNAMIC))         {   ...…

查看全部问答>

帮忙选下款51的学习板,一块带有USB通信芯片还有一块带光电耦合器等?

想买块功能及较全而且扩展性比较好的学习板在淘宝上看到两款: 1.天祥电子的TX-1C 51 http://auction1.taobao.com/auction/item_detail-0db2-ee156e7051b17fbc5513d677092d7362.jhtml 2.昂天电子的AT-12A  51 http://auction1.taobao.c ...…

查看全部问答>

提问一个关于税控IC卡的问题

请问在税控IC卡的命令中 以 80EE、80E0开头的是什么命令阿…

查看全部问答>

www.kingofcoder.com 100MB 免费空间 + 100MB mysql 空间

www.kingofcoder.com 100MB 免费空间 + 100MB mysql 空间 大家快点来呀 JSP, PHP, oracle空间, 很快就会开通, 大家快点登记吧…

查看全部问答>

执行fclose时会死机,为什么?

我现在在调试日志函数,在执行fclose函数时,偶尔可以通过,但是大部分时间运行到这里的时候都会死机,为什么?…

查看全部问答>

请教STR71Xdemo中flash.h的一段定义

#define FLASH_B0F0 0x00000001#define FLASH_B0F1 0x00000002#define FLASH_B0F2 0x00000004#define FLASH_B0F3 0x00000008#define FLASH_B0F4 0x00000010#define FLASH_B0F5 0 ...…

查看全部问答>

收到EZ430-RF2500 开发板

非常小巧,发几张分享给大家 …

查看全部问答>