Цитата(evgen2 @ May 17 2012, 13:01)

Братья и сестры,
-------
Вроде бы победил.
В этом HP03 нарисована следующая последовательность
Read pressure
S 0xEE A 0xFF A 0XF0 A P D S 0xEE A 0xFD A S 0XEF A MSB ALSB N PS: start bit
P: stop bit
A:acknowledge from slave
A: acknowledge from master
N: no acknowledge from master
D: delay for 40ms
MSB: conversion result MSB
LSB: conversion result LSB.
И, если использовать пример для i2c взятый из
\mcb1700.code.bundle.lpc17xx.keil\keil_examples\I2C\
(который под keil 4.23 еще нужно слегка допилить), то чтоб в ем выдать это самое дополнительное
S нужно делать вот так:
Код
#define PRESSURE 0xF0
#define TEMPERATURE 0xE8
d1 = HP03ReadValue(PRESSURE);
d2 = HP03ReadValue(TEMPERATURE);
....
unsigned int HP03ReadValue(unsigned char n)
{
unsigned int temp;
char *ptr, ch;
temp = 0;
I2CWriteLength[PORT_USED] = 3;
I2CReadLength[PORT_USED] = 0;
I2CMasterBuffer[PORT_USED][0] = 0xEE;
I2CMasterBuffer[PORT_USED][1] = 0xff;
I2CMasterBuffer[PORT_USED][2] = n;
I2CEngine( PORT_USED );
I2CStop( PORT_USED );
_delay_ms(50);
// 2, а не 3!!!!;Код
I2CWriteLength[PORT_USED] = 2; // !!!!
I2CReadLength[PORT_USED] = 2;
I2CMasterBuffer[PORT_USED][0] = 0xEE;
I2CMasterBuffer[PORT_USED][1] = 0xfd;
I2CMasterBuffer[PORT_USED][2] = 0xef; //!!! несмотря на то, что якобы пишем 2 байта, на самом деле пишем 3
I2CEngine( PORT_USED );
I2CStop( PORT_USED );
ptr = (char *) (&I2CSlaveBuffer[2]);
ch = ptr[1];
ptr[1] = ptr[0];
ptr[0] = ch;
temp = *((unsigned short int *) ptr);
return temp;
}
------
Температуру вроде бы как выдает правильную, а вот с давлением какая-то засада...
вместо атмосферного около 1000 (гектопаскалей) выдает 1800... пока не нашел ничего лучшего, как ввести коэффициент пересчета в мм.рт.ст 0.409245 вместо положенного 0.7500638