Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623

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

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

Author24 — интернет-сервис помощи студентам
Получил от китайца сей аппарат, пошел тут же гуглить что нибудь готовое, но не тут то было. Информации по нем очень мало, даже на 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2016, 21:59
Ответы с готовыми решениями:

Arduino IDE для Stm32
Добрый день! Подскажите пожалуйста, какие платы Stm32 можно программирование через Arduino IDE, ну и конечно чтобы она поддерживала...

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

Совместимость Arduino библиотек и Stm32
Добрый день! Подскажите, пожалуйста, почему Blink на Arduino UNO занимает мешьше 1кб, а на f103 15кб ?? Получается, что если я буду...

23
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,751
19.07.2016, 22:17
Путин, а документацию почитать?
https://media.digikey.com/pdf/... 540-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
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
19.07.2016, 23:17  [ТС]
Все хуже чем могло было быть. На том сайте как раз где я взял скетч было упоминание о совместимости SPI. А теперь получается писать придется с 0 и вроде диаграммы простые, но я не совсем представляю как реализовать сие, с подобным ранее никогда не сталкивался, поэтому сильно обрадовался присутствию хотя бы SPI, которого как оказывается и нет.

Не понятен сам процесс отправки, как генерировать SCLK и параллельно что-то передавать + слушать DOUT да еще и все синхронно. Не понятно какой длительностью должен быть импульс на бит возможно есть какие-то стандарты о которых я пока не знаю.
Хочется опять же побыстрее узнать сколько там мм рт.ст, а не растягивать дело в лучшем случае на неделю.
0
 Аватар для Voland_
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.07.2016, 10:44
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,751
20.07.2016, 11:02
Цитата Сообщение от Voland_ Посмотреть сообщение
чем же конкретно отличается описанное от обычного SPI?
ну я же сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
нет CSa
CS нужен слейву, чтобы выставить свои данные и подготовится к приемке
здесь же используется спецовая посылка, да и скорость очень медленная для SPI (32 килогерца)
хотя, даташит просмотрел мельком, сильно не вникал
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
20.07.2016, 13:26  [ТС]
Хорошо забудем про SPI будем считать что тут его нет, лишний раз залезть под капот не помешает.
Собсно пока есть такое представление:

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

Попробую пока по такой схеме начать что нибудь, дальше будет видно..
0
 Аватар для Voland_
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
20.07.2016, 15:44
ну, насчет "уровень нормализуется" - это вы, конечно, загнули. Но в остальном софтверный spi так и делается. ЗЫ: можете найти в сети кучу примеров программного spi.
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
21.07.2016, 15:12  [ТС]
Ну собсно посидел и посЕдел написал функцию отправки и приема, пробую отправить и получить, вроде отправляется а получить не могу..

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_
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
21.07.2016, 15:33
Цитата Сообщение от Путин Посмотреть сообщение
Невероятно, припаял по емкости к ногам питания МК и к удивлению от барометра стали приходить данные, работаем пока дальше..
ппц. Ну как так можно? Сделайте фото вашей установки ). Набось контроллер в воздухе висит? и на соплях проводками к батарейке припаян?

PS: зарекаюсь помогать страждущим без схемы и фотографии монтажа..
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
21.07.2016, 21:42  [ТС]
Цитата Сообщение от 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
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,751
21.07.2016, 21:55
Цитата Сообщение от Путин Посмотреть сообщение
DIN -> SPI2_MISO
DOUT -> SPI2_MOSI
только сейчас заметил
DIN (вход?) - MISO (Master Input Slave Output)
DOUT (выход?) MOSI(Master Output Slave Input )
вход на вход выход на выход?
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
21.07.2016, 22:14  [ТС]
Оказывается тут фигурирует "MCLK = 32.768 kHz" Как его подключить я чтот не пойму. Схема есть. Поставил его на МК на входы RTC, но по схеме будто это МК генерирует импульсы..
Миниатюры
Общение с барометром MS5540 на STM32 (Arduino to STM32)  
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
21.07.2016, 22:16  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
только сейчас заметил
DIN (вход?) - MISO (Master Input Slave Output)
DOUT (выход?) MOSI(Master Output Slave Input )
вход на вход выход на выход?
Да, так и есть, но в ходе кучи проб было уже раз 10 попробовано в других вариантах
Сейчас почитаем как генерировать 32кГц на ноге МК..
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,751
21.07.2016, 22:21
Путин, слушай, мне вот какая идея в голову ударила, а не может этот барометр быть мастером?
тогда твое подключение логично
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
21.07.2016, 22:46  [ТС]
ValeryS, Проверенно, результат отрицательный, собсно по даташиту тоже, МК всегда выступает в качестве инициатора. Пока остаюсь при таком варианте, когда я могу прочитать внутреннюю память барометра, но для работы ADC барометра нужно на вывод подать частоту в 32.768 кГц (пробовал припаяться к ноге кварца, ожидаемо не сработало ). Видимо все таки нужно с МК частоту задать..
0
Модератор
Эксперт по электронике
8962 / 6728 / 921
Регистрация: 14.02.2011
Сообщений: 23,751
21.07.2016, 23:02
Цитата Сообщение от Путин Посмотреть сообщение
но для работы ADC барометра нужно на вывод подать частоту в 32.768 кГц (пробовал припаяться к ноге кварца, ожидаемо не сработало ).
ну так сделай простейший генератор на ЛН1 или на 555 таймере
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
21.07.2016, 23:10
У Вас МК с таймерами рядом, а таймеров в нем, хоть ... ешь
0
45 / 25 / 16
Регистрация: 14.04.2011
Сообщений: 623
21.07.2016, 23:35  [ТС]
Сделал генерацию через таймер, замерил получилось ~32.768 кГц но в диапазон допустимых значений попадаем, однако ничего не изменилось, температура и давление по прежнему 0xFFFF, есть мысль что сенсор дефектный, но другой будет только через мес.. Попробую завтра еще в коде пошарить может чего упустил..
0
 Аватар для Voland_
1978 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
22.07.2016, 10:13
Цитата Сообщение от Путин Посмотреть сообщение
а, так и есть, но в ходе кучи проб было уже раз 10 попробовано в других вариантах
1) DIN нужно подключать к MOSI, DOUT - к MISO. Оставьте это подключение и больше не трогайте. В данном случае должно быть так, и только так. Схема - наше все. я об этом уже сказал.

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2016, 17:29
Помогаю со студенческими работами здесь

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

Проблема отслеживания кнопки stm32 + arduino IDE
Добрый день. Учусь программировать микроконтроллер stm32f103c6t6 купленный на алике. В качестве среды прошивки использую Arduino IDE. ...

Проблема с прошивкой stm32 через Arduino ide
Всем привет. Сразу скажу, что не эксперт в этом деле, поэтому ошибка может быть банальна :) В общем заливал прошивку на stm32 через...

Реализовать управление плеером на MPD (linux, stm32, arduino)
Для управления медиа проигрывателем демоном MPD из темы на линукс https://musicpd.org/doc/html/user.html Нужно реализлвать...

Создание считывателя импульсов на STM32 bluepill в Arduino IDE
Здравствуйте, уважаемые участники форума. Возник такой вопрос. Недавно перешёл с Arduino на Stm32, дабы переход произошёл более плавно,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи с помощью арктангенса для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Публикация в доработке, метод арктангенса в комментариях внизу. Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер