Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
1

Общение с барометром MS5540 на STM32 (Arduino to STM32)

19.07.2016, 21:59. Просмотров 1929. Ответов 23
Метки нет (Все метки)

Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не тут то было. Информации по нем очень мало, даже на Arduino нашел скетч только после глубокой раскопки гугл ответов и пытаюсь его теперь переписать под STM32, но пока плохо получается, а точнее вроде что-то получилось, но получаемые значения неправильные..

Возникла также проблема с подключением самого устройства.
Есть распиновка, но в ней нет знакомых мне слов (MOSI, MISO, и т.д) пробую тыкнуть на угад
SCLK -> SPI2_SCK
DIN -> SPI2_MISO
DOUT -> SPI2_MOSI
Остальные пины не задействованы. Не знаю на счет жизненной необходимости в 32kHz, но пока не имеем таких кварцов, а PWM занят под GPIO.

Если меняю MISO / MOSI местами то получаемые данные остаются прежними, тоесть получаю нули.
Исходя из этого можно предположить что я не правильно перевел скетч ардуино под STM32 и/или не правильно все это дело соединил..

Собсно инициализирую SPI2:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    /* Enable SPI2 and GPIOB clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);  
    //SET CS HIGH LEVEL
    GPIO_SetBits(GPIOB,GPIO_Pin_12); // Этот пин не соединен, код просто скопировал со старой наработки  
     
    /*Configure SPI2 pins: SCK, MISO and MOSI*/
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // 8Mhz / 16 = 500kHz  
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2, &SPI_InitStructure);
     
    /* Enable SPI2  */
    SPI_Cmd(SPI2, ENABLE); 
}
Дальше функция в loop'e:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
void update(void)
{
    uint16_t result1 = 0, inbyte1 = 0,
            result2 = 0, inbyte2 = 0,
            result3 = 0, inbyte3 = 0,
            result4 = 0, inbyte4 = 0;
    
    long c1 = 0, c2 = 0, c3 = 0, c4 = 0, c5 = 0, c6 = 0;
    unsigned int presMSB = 0; //first byte of value
    unsigned int presLSB = 0; //last byte of value
    unsigned int D1 = 0;
    
    unsigned int tempMSB = 0; //first byte of value
    unsigned int tempLSB = 0; //last byte of value
    unsigned int D2 = 0;
    
    long UT1 = 0;
    long dT = 0;
    long TEMP = 0;
    long OFF  = 0;
    long SENS = 0;
    long X = 0;
    long PCOMP = 0;
    float TEMPREAL = 0;
    float PCOMPHG = 0;
    
    long T2 = 0;
    float P2 = 0;
    
    resetsensor();
    
    //Calibration word 1
    SEND(0x1D);  //send first byte of command to get calibration word 1
    SEND(0x50); //send second byte of command to get calibration word 1
    setDataMode(SPI_MODE1);
    result1 = SEND(0x00); //send dummy byte to read first byte of word
    result1 = result1 << 8; //shift returned byte
    inbyte1 = SEND(0x00); //send dummy byte to read second byte of word
    result1 = result1 | inbyte1; //combine first and second byte of word
    
    resetsensor();
    
    //Calibration word 2; see comments on calibration word 1
    SEND(0x1D);
    SEND(0x60);
    setDataMode(SPI_MODE1);
    result2 = SEND(0x00);
    result2 = result2 << 8;
    inbyte2 = SEND(0x00);
    result2 = result2 | inbyte2;
 
    resetsensor(); //resets the sensor
 
    //Calibration word 3; see comments on calibration word 1
    SEND(0x1D);
    SEND(0x90);
    setDataMode(SPI_MODE1);
    result3 = SEND(0x00);
    result3 = result3 << 8;
    inbyte3 = SEND(0x00);
    result3 = result3 | inbyte3;
 
    resetsensor(); //resets the sensor
 
    //Calibration word 4; see comments on calibration word 1
    SEND(0x1D);
    SEND(0xA0);
    setDataMode(SPI_MODE1);
    result4 = SEND(0x00);
    result4 = result4 << 8;
    inbyte4 = SEND(0x00);
    result4 = result4 | inbyte4;
 
    //now we do some bitshifting to extract the calibration factors 
    //out of the calibration words;
    c1 = (result1 >> 1) & 0x7FFF;
    c2 = ((result3 & 0x003F) << 6) | (result4 & 0x003F);
    c3 = (result4 >> 6) & 0x03FF;
    c4 = (result3 >> 6) & 0x03FF;
    c5 = ((result1 & 0x0001) << 10) | ((result2 >> 6) & 0x03FF);
    c6 = result2 & 0x003F;
 
    resetsensor(); //resets the sensor
 
    //Pressure:
    SEND(0x0F); //send first byte of command to get pressure value
    SEND(0x40); //send second byte of command to get pressure value
    _delay_ms(35); //wait for conversion end
    setDataMode(SPI_MODE1);
    presMSB = SEND(0x00); //send dummy byte to read first byte of value
    presMSB = presMSB << 8; //shift first byte
    presLSB = SEND(0x00); //send dummy byte to read second byte of value
    D1 = presMSB | presLSB; //combine first and second byte of value
 
    resetsensor(); //resets the sensor  
 
    //Temperature:
    SEND(0x0F); //send first byte of command to get temperature value
    SEND(0x20); //send second byte of command to get temperature value
    _delay_ms(35); //wait for conversion end
    setDataMode(SPI_MODE1);
    tempMSB = SEND(0x00); //send dummy byte to read first byte of value
    tempMSB = tempMSB << 8; //shift first byte
    tempLSB = SEND(0x00); //send dummy byte to read second byte of value
    D2 = tempMSB | tempLSB; //combine first and second byte of value
 
    //calculation of the real values by means of the calibration factors and the maths
    //in the datasheet. const MUST be long
    UT1 = (c5 << 3) + 20224;
    dT = D2 - UT1;
    TEMP = 200 + ((dT * (c6 + 50)) >> 10);
    OFF  = (c2 * 4) + (((c4 - 512) * dT) >> 12);
    SENS = c1 + ((c3 * dT) >> 10) + 24576;
    X = (SENS * (D1 - 7168) >> 14) - OFF;
    PCOMP = ((X * 10) >> 5) + 2500;
    TEMPREAL = TEMP/10;
    PCOMPHG = PCOMP * 750.06 / 10000; // mbar*10 -> mmHg === ((mbar/10)/1000)*750/06*/
 
    /*Serial.print("Real Temperature in C = ");
    Serial.println(TEMPREAL);
 
    Serial.print("Compensated pressure in mbar = ");
    Serial.println(PCOMP);
    Serial.print("Compensated pressure in mmHg = ");
    Serial.println(PCOMPHG);*/
 
    //2-nd order compensation only for T < 20°C or T > 45°C
    
    lcd_clear();
    lcd_set_xy(0, 0);
    sprintf(buff, "M: %ld H: %.1f", PCOMP, PCOMPHG);
    lcd_out(buff);
 
    if (TEMP < 200)
    {
        T2 = (11 * (c6 + 24) * (200 - TEMP) * (200 - TEMP) ) >> 20;
        P2 = (3 * T2 * (PCOMP - 3500) ) >> 14;
    }
    else if (TEMP > 450)
    {
        T2 = (3 * (c6 + 24) * (450 - TEMP) * (450 - TEMP) ) >> 20;
        P2 = (T2 * (PCOMP - 10000) ) >> 13;    
    }
 
    if ((TEMP < 200) || (TEMP > 450))
    {
        const float TEMP2 = TEMP - T2;
        const float PCOMP2 = PCOMP - P2;
 
        float TEMPREAL2 = TEMP2/10;
        float PCOMPHG2 = PCOMP2 * 750.06 / 10000; // mbar*10 -> mmHg === ((mbar/10)/1000)*750/06
 
        /*Serial.print("2-nd Real Temperature in C = ");
        Serial.println(TEMPREAL2);
 
        Serial.print("2-nd Compensated pressure in mbar = ");
        Serial.println(PCOMP2);
        Serial.print("2-nd Compensated pressure in mmHg = ");
        Serial.println(PCOMPHG2);*/
        lcd_set_xy(0, 1);
        sprintf(buff, "M: %ld H: %.1f", PCOMP2, PCOMPHG);
        lcd_out(buff);
    }
}
второстепенные:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void resetsensor(void)
{
    setDataMode(SPI_MODE0);
    SEND(0x15);
    SEND(0x55);
    SEND(0x40);
}
 
void setDataMode(uint8_t mode) // эквивалент ардуино варианта
{
    SPI_Cmd(SPI2, DISABLE);
    
    // Хотел заюзать свитч, но опять же где то слышал что он сложнее чем IF
    if(mode == SPI_MODE0)
    {
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    }
    else if(mode == SPI_MODE1)
    {
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    }
    else if(mode == SPI_MODE2)
    {
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    }
    else if(mode == SPI_MODE3)
    {
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    }
 
    SPI_Init(SPI2, &SPI_InitStructure);
    SPI_Cmd(SPI2, ENABLE);
}
 
uint16_t SEND(uint16_t data)
{
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
    SPI_I2S_SendData(SPI2, data);
    
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
    return SPI_I2S_ReceiveData(SPI2);
}
Что дальше потыкать? В отладчике прошелся, получаю всегда строго ничего.
Если закомментить циклы в SEND:
C
1
2
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
то что-то начинает работать, но данные все равно далеки от действительности..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2016, 21:59
Ответы с готовыми решениями:

Stm32 nucleo f103rb и arduino
Всем привет. Хочу подключить пирометрический датчик gy-906 к stm32 nucleo f103rb. Всё подключаю как...

Чем связать STM32 + STM32 в одном корпусе?
Есть 2 платы: (1) - STM32 (Вывод на LCD + запись SD) и (2) - STM32F4 (обработка сигналов +...

STM32 - STM32 I2C
*****ПРОБЛЕМА ИСПРАВЛЕНА****ОТВЕТ НИЖЕ , НЕ ВЧИТЫВАЙТЕСЬ В КОД ПРОГРАММЫ,УТОНЕТЕ)), НУ ЕСЛИ ТОЛЬКО...

stm32 + FSMC + stm32
Доброе времени суток. Возможно ли к Ftosh памяти подцепить два Stm32F4. Один МК будет записывать...

Arduino NANO и STM32 записать bootlader через Jtag?
Здравствуйте! Купил я себе лазерный гравер из китая, уже давно но так чет и не пользовался)...

23
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
19.07.2016, 22:17 2
Путин, а документацию почитать?
https://media.digikey.com/pdf/Data%2.../MS5540-CM.pdf
там на совсем SPI, точнее совсем не SPI
The MS5540C communicates with microprocessors and other digital systems via a 3-wire synchronous serial
interface as shown in Fig. 1. The SCLK (Serial clock) signal initiates the communication and synchronises the
data transfer with each Bit being sampled by the MS5540C on the rising edge of SCLK and each Bit being sent
by the MS5540C on the rising edge of SCLK. The data should thus be sampled by the microcontroller on the
falling edge of SCLK and sent to the MS5540C with the falling edge of SCLK. The SCLK-signal is generated by
the microprocessor’s system. The digital data provided by the MS5540C on the DOUT pin is either the
conversion result or the software calibration data. In addition the signal DOUT (Data out) is also used to indicate
the conversion status (conversion-ready signal, see below). The selection of the output data is done by sending
the corresponding instruction on the pin DIN (Data input).
нет CSa
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
19.07.2016, 23:17  [ТС] 3
Все хуже чем могло было быть. На том сайте как раз где я взял скетч было упоминание о совместимости SPI. А теперь получается писать придется с 0 и вроде диаграммы простые, но я не совсем представляю как реализовать сие, с подобным ранее никогда не сталкивался, поэтому сильно обрадовался присутствию хотя бы SPI, которого как оказывается и нет.

Не понятен сам процесс отправки, как генерировать SCLK и параллельно что-то передавать + слушать DOUT да еще и все синхронно. Не понятно какой длительностью должен быть импульс на бит возможно есть какие-то стандарты о которых я пока не знаю.
Хочется опять же побыстрее узнать сколько там мм рт.ст, а не растягивать дело в лучшем случае на неделю.
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,524
20.07.2016, 10:44 4
Цитата Сообщение от ValeryS Посмотреть сообщение
там на совсем SPI, точнее совсем не SPI
чем же конкретно отличается описанное от обычного SPI? Я что-то не нашел нестыковок.
Цитата Сообщение от Путин Посмотреть сообщение
Не понятен сам процесс отправки, как генерировать SCLK и параллельно что-то передавать + слушать DOUT да еще и все синхронно. Не понятно какой длительностью должен быть импульс на бит возможно есть какие-то стандарты о которых я пока не знаю.
Все данные, которые вы хотите передать, должны быть выставлены на передающей ноге перед спадающим фронтом клока. Но перед этим же клоком нужно забрать данные.

ЗЫ: CS нога все-таки нужна в SPI. Фишка в синхронизации, т.к. когда CS поднят - у вас сбрасывается сдвигающий регистр в вашем датчике. Иначе в какой-то момент работы устройства по линии CLK может просочиться лишний импульс, и все дальнейшие данные пойдут наперекосяк.

Добавлено через 3 минуты
примерный алгоритм приема передачи в вашем случае такой:
{
CLK_ON();
WAIT();
GET_IN_BIT();
SET_OUT_BIT();
CLK_OFF();
SOME_DELAY();
} loop 8 bits;
0
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
20.07.2016, 11:02 5
Цитата Сообщение от Voland_ Посмотреть сообщение
чем же конкретно отличается описанное от обычного SPI?
ну я же сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
нет CSa
CS нужен слейву, чтобы выставить свои данные и подготовится к приемке
здесь же используется спецовая посылка, да и скорость очень медленная для SPI (32 килогерца)
хотя, даташит просмотрел мельком, сильно не вникал
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
20.07.2016, 13:26  [ТС] 6
Хорошо забудем про SPI будем считать что тут его нет, лишний раз залезть под капот не помешает.
Собсно пока есть такое представление:

Поднимаю SCLK и жду когда уровень нормализуется, передаю бит и прижимаю SCLK к земле. Так передаю 3 бита в качестве Старта. Если все хорошо, то датчик в ответ прижимает DOUT. Если это так то я далее передаю по тому же принципу как и старт остальные биты и т.д.

Попробую пока по такой схеме начать что нибудь, дальше будет видно..
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,524
20.07.2016, 15:44 7
ну, насчет "уровень нормализуется" - это вы, конечно, загнули. Но в остальном софтверный spi так и делается. ЗЫ: можете найти в сети кучу примеров программного spi.
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
21.07.2016, 15:12  [ТС] 8
Ну собсно посидел и посЕдел написал функцию отправки и приема, пробую отправить и получить, вроде отправляется а получить не могу..

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
void SEND(const bool* data, uint8_t sz)
{
    uint8_t i;
    uint8_t size = sz;
    
    for (i = 0; i < 3; i++) // START
    {
        GPIO_SetBits(GPIOB, BAR_DIN);
        GPIO_SetBits(GPIOB, BAR_SCLK);
        
        _delay_us(25);      
        GPIO_ResetBits(GPIOB, BAR_SCLK);        
        _delay_us(25);
    }
    
    while (sz)
    {
        if (data[size - sz--])
            GPIO_SetBits(GPIOB, BAR_DIN);
        else
            GPIO_ResetBits(GPIOB, BAR_DIN);
 
        GPIO_SetBits(GPIOB, BAR_SCLK);
        _delay_us(25);
        GPIO_ResetBits(GPIOB, BAR_SCLK);
        _delay_us(25);
    }
    
    for (i = 0; i < 3; i++) // STOP
    {
        GPIO_ResetBits(GPIOB, BAR_DIN);
        
        GPIO_SetBits(GPIOB, BAR_SCLK);
        _delay_us(25);
        GPIO_ResetBits(GPIOB, BAR_SCLK);        
        _delay_us(25);
    }
}
 
void RECV(bool* recv, uint8_t wait, uint8_t sz)
{
    uint8_t size = sz;
    GPIO_SetBits(GPIOB, BAR_SCLK);
    _delay_us(25);
    GPIO_ResetBits(GPIOB, BAR_SCLK);
    _delay_us(25);
 
    if (wait > 0)
        _delay_ms(wait);
    
    while (sz)
    {
        _delay_us(25);
        GPIO_ResetBits(GPIOB, BAR_SCLK);
        
        recv[size - sz--] = GPIO_ReadInputDataBit(GPIOB, BAR_DOUT);
        _delay_us(25);
        GPIO_SetBits(GPIOB, BAR_SCLK);
    }
}
Инициализирую:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Pin = BAR_SCLK | BAR_DIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
 
    GPIO_InitStructure.GPIO_Pin = BAR_DOUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}
Далее хочу получить Word1
C
1
2
3
4
5
6
7
const bool data[] = { false, true, false, true, false, true };
bool recv[16];
memset(recv, NULL, 16);
 
init();
SEND(data, 6);
RECV(recv, 0, 16);
Если я делаю BAR_DOUT с подтяжкой к питанию, то все равно получаю нули, пробовал замкнуть светодиодом все хорошо, он светит как и положено, а я получаю данные будто он прижат к земле..

Добавлено через 1 минуту
В даташите краем глаза увидел что данные передаются со скоростью 500 kHz, может я со скоростью не попал?
Отправка судя по графикам проходит в момент нарастания фронта на SCLK, а получение наоборот в момент спада

Добавлено через 22 часа 7 минут
Невероятно, припаял по емкости к ногам питания МК и к удивлению от барометра стали приходить данные, работаем пока дальше..
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,524
21.07.2016, 15:33 9
Цитата Сообщение от Путин Посмотреть сообщение
Невероятно, припаял по емкости к ногам питания МК и к удивлению от барометра стали приходить данные, работаем пока дальше..
ппц. Ну как так можно? Сделайте фото вашей установки ). Набось контроллер в воздухе висит? и на соплях проводками к батарейке припаян?

PS: зарекаюсь помогать страждущим без схемы и фотографии монтажа..
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
21.07.2016, 21:42  [ТС] 10
Цитата Сообщение от Voland_ Посмотреть сообщение
Набось контроллер в воздухе висит? и на соплях проводками к батарейке припаян?
Для МК сделана платка ЛУТ'ом, но была такая идея после ~10 раз неудачного ЛУТА и кучи испорченного PCB.. Питание идет от программатора. Фотку как нибудь позже, там просто куча проводов.

Взглянул на даташит барометра, смотрю рекомендуют тантал на 47uf ну я впаял и омг я снова получаю ничего!!
Отпаял тантал назад и ничего не изменилось! Припаял назад.. Купил таки 32.768 кварцы, а то в даташите написано что крайняя необходимость в них есть, только вывод на него 1.. Судя по схеме 1 кварц на барометр и МК. Сейчас еще с кодом поиграюсь, не могу понять куда исчезло всё..
Под отладчиком 3 раза подряд ходил, ответ был всегда одним и тем же, что собсно правильно, а теперь нули и все..

Добавлено через 1 минуту
Не могу еще определиться куда подтяжку на вход от барометра делать?

Добавлено через 1 минуту
определенной схемы нет, просто питание от ST-Link, дальше просто от МК проводами прямое соединение с барометром. Ну еще тантал на барометре между выводами питания и на МК к каждой ноге по 100 nF припаял

Добавлено через 56 минут
Поставил капкан при чтении:
C
1
while(!GPIO_ReadInputDataBit(GPIOB, BAR_DOUT));
Иногда бывает кто-то проходит и в итоге я получаю из 16 бит все единицы, видать надо с задержкой поиграться, чую данные где-то близко.

Добавлено через 4 часа 10 минут
В ходе проб и ошибок я таки смог получить калибровочные данные, и они очень похоже что валидные, однако не могу получить температуру и собсно давление, в обоих случаях приходит 0x0000FFFF. Это как раз те самые данные которые идут с задержкой по даташиту в 33мс, но чую что это далеко не так, будем пробовать играться с задержкой...
0
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
21.07.2016, 21:55 11
Цитата Сообщение от Путин Посмотреть сообщение
DIN -> SPI2_MISO
DOUT -> SPI2_MOSI
только сейчас заметил
DIN (вход?) - MISO (Master Input Slave Output)
DOUT (выход?) MOSI(Master Output Slave Input )
вход на вход выход на выход?
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
21.07.2016, 22:14  [ТС] 12
Оказывается тут фигурирует "MCLK = 32.768 kHz" Как его подключить я чтот не пойму. Схема есть. Поставил его на МК на входы RTC, но по схеме будто это МК генерирует импульсы..
0
Миниатюры
Общение с барометром MS5540 на STM32 (Arduino to STM32)  
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
21.07.2016, 22:16  [ТС] 13
Цитата Сообщение от ValeryS Посмотреть сообщение
только сейчас заметил
DIN (вход?) - MISO (Master Input Slave Output)
DOUT (выход?) MOSI(Master Output Slave Input )
вход на вход выход на выход?
Да, так и есть, но в ходе кучи проб было уже раз 10 попробовано в других вариантах
Сейчас почитаем как генерировать 32кГц на ноге МК..
0
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
21.07.2016, 22:21 14
Путин, слушай, мне вот какая идея в голову ударила, а не может этот барометр быть мастером?
тогда твое подключение логично
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
21.07.2016, 22:46  [ТС] 15
ValeryS, Проверенно, результат отрицательный, собсно по даташиту тоже, МК всегда выступает в качестве инициатора. Пока остаюсь при таком варианте, когда я могу прочитать внутреннюю память барометра, но для работы ADC барометра нужно на вывод подать частоту в 32.768 кГц (пробовал припаяться к ноге кварца, ожидаемо не сработало ). Видимо все таки нужно с МК частоту задать..
0
ValeryS
Модератор
7484 / 5666 / 726
Регистрация: 14.02.2011
Сообщений: 19,374
Завершенные тесты: 1
21.07.2016, 23:02 16
Цитата Сообщение от Путин Посмотреть сообщение
но для работы ADC барометра нужно на вывод подать частоту в 32.768 кГц (пробовал припаяться к ноге кварца, ожидаемо не сработало ).
ну так сделай простейший генератор на ЛН1 или на 555 таймере
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
21.07.2016, 23:10 17
У Вас МК с таймерами рядом, а таймеров в нем, хоть ... ешь
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
21.07.2016, 23:35  [ТС] 18
Сделал генерацию через таймер, замерил получилось ~32.768 кГц но в диапазон допустимых значений попадаем, однако ничего не изменилось, температура и давление по прежнему 0xFFFF, есть мысль что сенсор дефектный, но другой будет только через мес.. Попробую завтра еще в коде пошарить может чего упустил..
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,524
22.07.2016, 10:13 19
Цитата Сообщение от Путин Посмотреть сообщение
а, так и есть, но в ходе кучи проб было уже раз 10 попробовано в других вариантах
1) DIN нужно подключать к MOSI, DOUT - к MISO. Оставьте это подключение и больше не трогайте. В данном случае должно быть так, и только так. Схема - наше все. я об этом уже сказал.

2) По поводу дефектности - можно считать, что вы его могли спалить, включив выходы встречно. Косвенно можно попытаться это выяснить - померяйте ток потребления датчика. По ДШ он не должен быть >1mA. Но если датчик испорчен - он должен кушать >10..15mA я так думаю. Из-за пробитых выходных полярников на выходе DOUT.
0
Путин
44 / 24 / 15
Регистрация: 14.04.2011
Сообщений: 615
22.07.2016, 17:29  [ТС] 20
Потребление 30 - 50 uA. Насчет дефектности сам сенсор имеет механические повреждения в области как раз датчиков. Есть мысль что чип внутри остался цел (т.к. я без проблем читаю 64bit память сенсора), а остальное собсно повредилось, хотя повреждения в виде разрезов внутри етой банки, но они не глубокие и судя по даташиту банка залита защитным гелем так что не факт.. Прикрепил фото с микроскопа.. Не могли же такие на вид легкие повреждения повредить сенсоры?
0
Миниатюры
Общение с барометром MS5540 на STM32 (Arduino to STM32)   Общение с барометром MS5540 на STM32 (Arduino to STM32)   Общение с барометром MS5540 на STM32 (Arduino to STM32)  

22.07.2016, 17:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2016, 17:29

ARDUINO IDE + STM32 или о нежном переходе с AVR :)
Тема в первую очередь для фанатов быстрых решений на AVR и ARDUINO (типа меня) и тех кто ещё на...

SerialPort. Общение с Arduino
Здравствуйте! Пытаюсь наладить общение между ПК и arduino через COM-порт, кусок кода: void...

Живое общение об Arduino, проекты и другое
Доброго времени суток. Я давно искал конференцию посвященную Arduino, т.к. были вопросы, которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru