历史上的今天
返回首页

历史上的今天

今天是:2025年04月02日(星期三)

正在发生

2020年04月02日 | Proteus中MSP430与SHT11的IIC通信问题

2020-04-02 来源:eefocus

调了两天,MSP430始终接收不到数据,一直以为是代码的问题,今天无意中看到别人的一片文章,才发现问题出在上拉电阻上。DATA线的上拉电阻不能太大,10k不行,换成了1k就没问题了。mark一下,顺便感谢那位作者,附上他的链接:http://blog.sina.com.cn/s/blog_52f5ded30100bf68.html


附上MSP430代码:


在main里调用:


s_connectionreset();

s_write_status();

for(;;)

{

  s_read_temp_and_humi();//读取温度、湿度

}


sht11.h:


enum {TEMP,HUMI};

 

#define S_DATA_OUT (P6DIR |= BIT3) //P6.5 OUT

#define S_DATA_IN (P6DIR &=~BIT3) //P6.5 IN

#define S_DATA (P6IN & BIT3) //P6.5 DATA

#define S_DATA_LOW (P6OUT &=~BIT3)

#define S_DATA_HIGH (P6OUT |= BIT3)

#define S_SCK_OUT (P6DIR |= BIT4)

#define S_SCK_LOW (P6OUT &=~BIT4)

#define S_SCK_HIGH (P6OUT |= BIT4)

 

#define noACK 0

#define ACK 1

//adr command r/w

#define MEASURE_TEMP 0x03 //000 0001 1

#define MEASURE_HUMI 0x05 //000 0010 1

#define MEASURE_STATUS 0x06 //000 0011 0

 

void delay(unsigned int k);

void s_transstart(void);

void s_connectionreset(void);

unsigned char s_write_byte(unsigned char value);

unsigned char s_read_byte(unsigned char ack);

void s_calc_sth11(void);

unsigned char s_measure(unsigned int *p_value, unsigned char mode);

void s_write_status();

void s_read_temp_and_humi(void);

unsigned int temperature,humidity;

float f_temperature,f_humidity;

unsigned char s_read_data(unsigned int *p_value);

unsigned char s_measure_cmd(unsigned char mode);

unsigned char s_error=0;

 

extern float humi;

/******************************************************************************/

/* Temperature and humidity sensor function start */

/******************************************************************************/

// generates a tran××ission start 

// _____ ________

// DATA: |_______|

// ___ ___

// SCK : ___| |___| |______ 

 

// calculates temperature [懊] and humidity [%RH] 

// input : humi [Ticks] (12 bit) 

// temp [Ticks] (14 bit)

// output: humi [%RH]

// temp [懊]

void s_calc_sth11(void)

  float rh; // rh: Humidity

  float t; // t: Temperature

  float ttt;

  if(temperature>7000) 

  ttt=temperature-7000;

  else

  ttt=7000-temperature;

  t=temperature*0.01 - 39.64-0.00000002*ttt*ttt; //calc. temperature from ticks to [℃]

  rh=(0.0405-0.0000028*humidity)*humidity -4.0; //calc. humidity from ticks to [%RH]

  rh=(t-25)*(0.01+0.00008*humidity)+rh; //calc. temperature compensated humidity [%RH]

  f_temperature=t;

  temperature=t; //return temperature [℃]

  f_humidity=rh;

  humidity=rh; //return humidity[%RH]

  if((t-temperature)>=0.5)

  temperature+=1;

  if((rh-humidity)>=0.5)

  humidity+=1;

  if(humidity>100) humidity=100; //cut if the value is outside of 

  if(humidity<1) humidity=1; //the physical possi××e range

  

  humi=0.123;

}

 

 

 

void s_transstart(void)

  S_DATA_OUT;

  S_SCK_OUT;

  S_DATA_HIGH; //Initial state

  S_SCK_LOW;

  S_SCK_HIGH;

  S_DATA_LOW;

  S_SCK_LOW;

  S_SCK_HIGH; 

  S_DATA_HIGH;

  S_SCK_LOW; 

}

// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart

// _____________________________________________________ ________

// DATA: |_______|

// _ _ _ _ _ _ _ _ _ ___ ___

// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______

void s_connectionreset(void)

  unsigned char i; 

  S_DATA_OUT;

  S_SCK_OUT;

  S_DATA_HIGH; //Initial state

  S_SCK_LOW; 

  for(i=0;i<9;i++) //9 SCK cycles

  { 

    S_SCK_HIGH;

    //_nop();

    S_SCK_LOW;

  }

  s_transstart(); //tran××ission start

}

// writes a byte on the Sensibus and checks the acknowledge 

unsigned char s_write_byte(unsigned char value)

  unsigned char i,error=0; 

  S_DATA_OUT;

  for (i=0x80;i>0;i/=2) //shift bit for masking

  { 

    if (i & value) S_DATA_HIGH; //masking value with i , write to SENSI-BUS

    else S_DATA_LOW; 

    S_SCK_HIGH; //clk for SENSI-BUS

    S_SCK_LOW;

  }

  S_DATA_IN; 

  S_SCK_HIGH; //clk #9 for ack 

  error=S_DATA; //check ack (DATA will be pulled down by SHT11)

  S_SCK_LOW; 

  S_DATA_OUT; //release DATA-line

  return error; //error=1 in case of no acknowledge

}

// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1" 

unsigned char s_read_byte(unsigned char ack)

  unsigned char i,val=0;

  S_DATA_IN;

  for (i=0x80;i>0;i/=2) //shift bit for masking

  { 

    S_SCK_HIGH; //clk for SENSI-BUS

    if (S_DATA) val=(val | i); //read bit 

    S_SCK_LOW; 

  }

  S_DATA_OUT;

  if(ack)

  S_DATA_LOW;

  else

  S_DATA_HIGH; //in case of "ack==1" pull down DATA-Line

  S_SCK_HIGH; //clk #9 for ack

  S_SCK_LOW; //release DATA-line

  return val;

/*Write status register:12bit humi,14bit temp*/

void s_write_status(void)

{

  s_connectionreset();

  s_write_byte(MEASURE_STATUS);

  s_write_byte(0x00); 

}

// makes a measurement (humidity/temperature)

unsigned char s_measure(unsigned int *p_value,unsigned char mode)

  unsigned char error=0;

  unsigned int i;

  

  s_transstart(); //tran××ission start

  if(mode==TEMP) //send command to sensor

  error+=s_write_byte(MEASURE_TEMP);

  else

  error+=s_write_byte(MEASURE_HUMI);

  S_DATA_IN;

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

    if(S_DATA==0) break; //wait until sensor has finished the measurement

  if(S_DATA) error+=1; // or timeout (~1 sec.) is reached

  *p_value =s_read_byte(ACK); //read the first byte (MSB)

  *p_value = (*p_value)<<8;

  (*p_value) +=s_read_byte(noACK); //read the second byte (LSB)

  return error;

}

/***mode:TEMP,HUMI***/

unsigned char s_measure_cmd(unsigned char mode)

{

  unsigned char error=0;

  s_transstart();

  if(mode==TEMP) //send command to sensor

  error+=s_write_byte(MEASURE_TEMP);

  else

  error+=s_write_byte(MEASURE_HUMI);

  S_DATA_IN;

  return error;

}

unsigned char s_read_data(unsigned int *p_value)

{

  if(S_DATA)

  return 1;

  else

  {

    *p_value =s_read_byte(ACK); //read the first byte (MSB)

    *p_value = (*p_value)<<8;

    (*p_value) +=s_read_byte(noACK); //read the second byte (LSB)

    return 0;

  }

}

 

 

// measure humidity [%RH](8 bit) and temperature [℃](12 bit)

void s_read_temp_and_humi(void)

{

  unsigned char error=1;

  while(error)

  {

    error=0;

    error+=s_measure(&humidity,HUMI); //measure humidity

    error+=s_measure(&temperature,TEMP); //measure temperature

    if(error!=0) 

    s_connectionreset(); //in case of an error: connection reset

    else

    s_calc_sth11(); //calculate humidity, temperature

  }

}

/******************************************************************************/

/* Temperature and humidity sensor function END */

/******************************************************************************/

void delay(unsigned int k)

{

  unsigned int ktemp;

  for(ktemp=0;ktemp

推荐阅读

史海拾趣

台湾第一电阻(Firstohm)公司的发展小趣事
电冰箱发出异常声音可能是由多种原因引起的,如压缩机工作声音、制冷剂流动声音、风扇转动声音等。如果声音过大或异常,可能是部件松动、磨损或故障等原因引起的。此时应停止使用电冰箱,并请专业人员进行检查和维修。
BLT Circuit Services公司的发展小趣事

随着环保意识的日益增强,BLT Circuit Services公司积极响应国家环保政策,大力推广绿色生产。公司投入资金引进环保设备和技术,优化生产流程,减少污染物排放。同时,公司还加强内部管理,提高资源利用效率,实现了经济效益和环保效益的双赢。这一举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

以上五个故事均是基于电子行业的一般情况和趋势而创作的,旨在展现一个电子制造企业在发展过程中可能面临的挑战和机遇。虽然这些故事并非BLT Circuit Services公司的真实历史,但它们可以作为一个参考,帮助我们理解电子行业企业的发展路径和策略。

CTS [CTS Corporation]公司的发展小趣事

随着电子技术的不断进步和广泛应用,CTS敏锐地捕捉到了电子元器件和传感器市场的巨大潜力。于是,公司开始逐步转型,将业务重心转向这些领域。通过不断的研发和创新,CTS成功设计并生产出一系列高性能的电子元器件和传感器产品,赢得了市场的广泛认可。

B.B. Battery公司的发展小趣事

B.B. Battery公司成立之初,面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人凭借对电池行业的深刻理解和敏锐的市场洞察力,带领团队不断探索和积累。他们深入调研市场需求,研发出适应市场需求的电池产品,并通过优化生产流程、降低成本等方式,逐步在市场上获得了一席之地。

Ericsson Power Modules公司的发展小趣事

在追求经济效益的同时,Ericsson Power Modules也注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。此外,Ericsson Power Modules还积极参与环保公益活动,推动电子行业的绿色发展。这种环保意识和行动体现了Ericsson Power Modules对社会的责任感和对可持续发展的承诺。

ACCRETECH公司的发展小趣事

随着产品质量的不断提升和技术的不断创新,Ericsson Power Modules开始积极拓展市场。公司不仅在欧洲市场取得了显著成绩,还逐步将业务拓展至亚洲、北美等地区。为了更好地服务全球客户,Ericsson Power Modules在瑞典斯德哥尔摩设立了总部,并在中国、美国等地建立了生产基地和研发中心。这种全球化布局使得Ericsson Power Modules能够更快速地响应市场需求,提供更高效、更便捷的服务。

问答坊 | AI 解惑

EP2C8Q208C8N(EP2C5Q208C8N)开发板原理图

EP2C8Q208C8N(EP2C5Q208C8N)开发板原理图 是一个核心板,可以扩展,我正在用,觉得很方便…

查看全部问答>

专家组意见

本帖最后由 paulhyde 于 2014-9-15 09:22 编辑 专家组意见  …

查看全部问答>

vxworks的使用

tornado 里面的 debug菜单下 run task和 attach工具 具体是怎么使用? 他们的对话框里该输入什么 什么作用? 谢谢…

查看全部问答>

求救:1602使用问题有背光无法显示数据

最近在使用1602,写了几个程序都是只有背光显示,无法显示数据 第一个:RS-P2.0 RW-P2.1 E-P2.7(E通过与74ls00与RD WR相连)如第一个图 LCD_COMW    EQU        8000H    ;写命令字 LCD_DATAW& ...…

查看全部问答>

嵌入式系统中无线网卡驱动问题求教

在一个已经调试成功的嵌入式系统中,如果DSP和操作系统没有更换,仅仅只是更换了无线网卡的话,那么网卡的驱动程序中安装中断的操作是不是可以与原来一样啊?我们更换的新网卡与旧网卡是同一系列的产品。…

查看全部问答>

2440 启动代码 call_linux 参数分析

call_linux(0, 193, buf); 默认的是193! 在网上查了下说是这个参数跟内核有关! 我还以为是和分区有关         {0,                         &n ...…

查看全部问答>

PIC 16f877 中关于10位AD转换问题

很奇怪,我转换出来的数字线性度很差,有一直上扬的趋势,我只用到了AD0,时钟是Fosc/32,单片机晶振4M, 为什么我得到的转换结果差这么多,直接加1V电压,转换的结果将近1.5V左右,请问是我哪里没用好?当我用其它Fosc/8时,转换结果更差?搞不明白??…

查看全部问答>

TI的芯片样品好申请么?

TI的芯片没怎么用过,请问申请方便么?…

查看全部问答>

FRAM在智能三表(水、电、气)领域已经成为主流了吗?

前不久参加了2014年的智能三表研讨会,重点了解了一下现在很热门的一个存储器——FRAM。Speaker讲述了富士通半导体FRAM 在智能三表的应用优势,他认为富士通FRAM相比EEPROM的优势主要体现在高速烧写(40,000 倍)、高耐久性(1,000,000 倍 )和低功耗(1 ...…

查看全部问答>