реклама на сайте
подробности

 
 
> STM32 USART и DS18B20, траблы с приемо-передачей байтов
iPKM
сообщение Aug 19 2011, 19:53
Сообщение #1





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Пытаюсь завести DS18B20 на STM32(дискавери) по USART. Работу с 1-wire делаю по апптоуту максима
Проблемы начинаются после инициализации, после того как послали 0xF0 получили 0x0E, что значит датчик наместе, далее посылаем 0xCC и т.п не буду повторять код. вот собственно после передачи всех команд начинаем получать биты температуры, но все время нули вылазят. Я думаю что ошибка возможна в OneWireReadByte() хотя хз. OneWireSendByte() формирует из hex -> bin вроде правильно, к примеру 0xCC в двоичной 1100 1100, OneWireSendByte формирует и отсылает 0011 0011, какбы задом наперед, т.е сначала младшие биты слова потом старшие.

CODE
#include "stm32l1xx.h"
#include "PLL/inc/stm32l1xx_gpio.h"
#include "PLL/inc/stm32l1xx_usart.h"
#include "PLL/inc/stm32l1xx_rcc.h"
void Delay_ms(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);

nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
}

void initPereherial()
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Включаем тактирование */
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

/* USART1 Rx (PA10) вход */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* USART1 Tx (PA9) выход */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Конфигурируем порты PA9, PA10 как альтернативную функцию для USART1 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

}

void UsartInit(int BaudRate)
{
USART_InitTypeDef USART_InitStructure;

/* Настраиваем USART1 */
USART_InitStructure.USART_BaudRate = BaudRate;
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;

/* Включаем USART1 */
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}

volatile uint16_t temp[7];

void OneWireSendByte(uint16_t byte)
{
for(int i=0; i<8; i++)
{
if((byte & (1<<i) ) != 0)
{
USART_SendData(USART1, 0xFF);
Delay_ms(1);
}else{
USART_SendData(USART1, 0x00);
}
}
}

uint16_t OneWireReadByte()
{
uint16_t result=0;

for(int i=0; i<8; i++)
{
USART_SendData(USART1, 0xFF);
Delay_ms(1);
}

for(int i=0; i<8; i++)
{
if(USART_ReceiveData(USART1) != 0xFF)
{
result |= (1<<i);
}
}

return result;
}


int main()
{
initPereherial();

UsartInit(9800);
USART_SendData(USART1, 0xF0);


USART_DeInit(USART1);
UsartInit(115200);
OneWireSendByte(0xCC);
OneWireSendByte(0x44);

Delay_ms(750);

USART_DeInit(USART1);
UsartInit(9800);
USART_SendData(USART1, 0xF0);


USART_DeInit(USART1);
UsartInit(115200);
OneWireSendByte(0xCC);
OneWireSendByte(0xBE);


for(int i=0; i<8; i++)
{
temp[i] = OneWireReadByte();
}

}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
iPKM
сообщение Aug 22 2011, 11:43
Сообщение #2





Группа: Участник
Сообщений: 11
Регистрация: 19-08-11
Пользователь №: 66 793



Отложил юарт в сторону и попробовал напрямую работать с 1-wire. Сначала сам написал код по дрыганью ножками с указанными задержками по даташиту, в конце концов все равно получаю 0xFF, с горя решил глянуть пример работы с этим датчиком под STM32, нашел в китае один проект, перенёс себе, исправил в некоторых местах вызовы системной библы под свой МК, в этоге теже 0xFF в ответ.
Думал уж датчик голимый, но он ведь отвечает присутствием значит не палёный, хотя хз работает ли в нем сам датчик температуры. если кому интересно код работы с 1-wire из китая:

Код
#include "stm32l1xx.h"
#include "PLL/inc/stm32l1xx_gpio.h"
#include "PLL/inc/stm32l1xx_usart.h"
#include "PLL/inc/stm32l1xx_rcc.h"

#define SKIP_ROM 0xCC
#define CONVERT 0x44
#define READ_TEMP 0xBE

#define DS_PORT GPIOA    
#define DS_PIN GPIO_Pin_5

#define ResetDQ() GPIO_WriteBit(DS_PORT, DS_PIN, Bit_RESET)
#define SetDQ() GPIO_WriteBit(DS_PORT, DS_PIN, Bit_SET)
#define GetDQ() GPIO_ReadInputDataBit(DS_PORT,DS_PIN)

void delay_1ms(uint32_t ms)
{
        volatile uint32_t nCount;
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);

        nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
        for (; nCount!=0; nCount--);
}

void delay_1us(uint32_t us)
{
        SysTick->LOAD=us*9;
    SysTick->CTRL|=0x01;
    while(!(SysTick->CTRL&(1<<16)));
    SysTick->CTRL=0x00000000;
    SysTick->VAL=0x00000000;  
}

void GPIO_init()
{
      RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOAEN, ENABLE);
      //GPIOA->BSRRL = GPIO_BSRR_BS_5;  
      //GPIOA->BSRRH = GPIO_BSRR_BS_5;    
}
void Init_ds18b20(void)    
{
    SetDQ();
    delay_1us(30);    
    ResetDQ();    
    delay_1us(470);      
    SetDQ();      
    delay_1us(30);    
    while(!GetDQ());    
    delay_1us(450);
    SetDQ();    
}


void DS18B20WriteByte( unsigned char  Dat)
{
    uint8_t i;
    for(i=8;i>0;i--)
    {
        ResetDQ();
        delay_1us(5);

        if(Dat&0x01)    
        SetDQ();
        else
        ResetDQ();

        delay_1us(65);
        SetDQ();
        delay_1us(2);
        Dat>>=1;
    }
}

unsigned char  DS18B20ReadByte(void)
{
     unsigned char  i,Dat;
    SetDQ();
    delay_1us(5);
    for(i=0;i<8;i++)
    {
        Dat>>=1;
        ResetDQ();
        delay_1us(5);
        SetDQ();
        delay_1us(5);

        if(GetDQ())
            Dat|=0x80;
        else
            Dat&=0x7f;
        delay_1us(65);
        SetDQ();
    }
    return Dat;
}

unsigned char  readtemperature(void)
{
     unsigned char  a,b;
    Init_ds18b20();
    DS18B20WriteByte(SKIP_ROM);
    DS18B20WriteByte(CONVERT);
    delay_1ms(750);    

    Init_ds18b20();
    DS18B20WriteByte(SKIP_ROM);
    DS18B20WriteByte(READ_TEMP);    

    a=DS18B20ReadByte();    
    b=DS18B20ReadByte();

    b<<=4;
    b+=(a&=0xf0)>>4;

    return b;
}

volatile int temp[8];

int main()
{
   GPIO_init();
  
  volatile uint8_t value=readtemperature();
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- iPKM   STM32 USART и DS18B20   Aug 19 2011, 19:53
- - Flexz   Загляните внурь функций USART_SendData/USART_Recei...   Aug 19 2011, 20:26
|- - iPKM   Цитата(Flexz @ Aug 20 2011, 00:26) Заглян...   Aug 19 2011, 20:32
|- - Flexz   Цитата(iPKM @ Aug 20 2011, 00:32) и что я...   Aug 20 2011, 19:09
|- - iPKM   Цитата(Flexz @ Aug 20 2011, 23:09) не чит...   Aug 21 2011, 09:45
- - ILYAUL   А зачем Вы задержки налепили в 1 ms? Зачем они там...   Aug 20 2011, 09:29
|- - iPKM   Цитата(ILYAUL @ Aug 20 2011, 13:29) А зач...   Aug 20 2011, 17:06
- - ILYAUL   Да кстати , между командами 0х44 + Delay и 0xBE до...   Aug 21 2011, 10:18
- - Flexz   Ну дело ваше, конечно, но на вашем месте прежде че...   Aug 21 2011, 10:19
|- - iPKM   Цитата(Flexz @ Aug 21 2011, 14:19) Ну дел...   Aug 21 2011, 12:37
|- - ILYAUL   Цитата(iPKM @ Aug 21 2011, 16:37) Я не на...   Aug 21 2011, 14:54
|- - iPKM   Цитата(ILYAUL @ Aug 21 2011, 18:54) Это и...   Aug 21 2011, 15:58
|- - Schulz_K   Цитата(iPKM @ Aug 21 2011, 18:58) Видать ...   Aug 21 2011, 17:42
|- - ILYAUL   Цитата(iPKM @ Aug 21 2011, 19:58) не пудр...   Aug 21 2011, 18:36
- - Schulz_K   В вашем коде я не вижу, где задается временная диа...   Aug 21 2011, 12:39
|- - iPKM   Цитата(Schulz_K @ Aug 21 2011, 16:39) Воз...   Aug 21 2011, 13:35
- - Schulz_K   А сколько в вашем случае времени проходит при чтен...   Aug 21 2011, 14:36
- - kumle   Посмотри тут http://eugenemcu.ru/publ/13-1-0-74 Та...   Aug 22 2011, 06:06
- - Schulz_K   В вашем новом коде я не вижу, как настроены пин GP...   Aug 22 2011, 12:00
|- - iPKM   Цитата(Schulz_K @ Aug 22 2011, 16:00) В в...   Aug 22 2011, 12:19
- - kumle   Может частота тактирования не та ?   Aug 22 2011, 13:47
- - Schulz_K   А вот эта строка: Цитатаfor (; nCount!=0; nCou...   Aug 22 2011, 14:49
|- - iPKM   Цитата(Schulz_K @ Aug 22 2011, 18:49) А в...   Aug 22 2011, 15:01
- - Schulz_K   А как вы проверяли, что 1мс точно соответствует - ...   Aug 23 2011, 08:30
|- - servol   Таже проблема была. 0x0E датчик отвечает , а дальш...   Dec 15 2011, 22:14
|- - Misha_Traktorist   Цитата(servol @ Dec 16 2011, 02:14) Таже ...   Jan 8 2013, 16:31
- - hd44780   До DS я пока не дошёл (в области STM32 я пока в ст...   Jan 9 2013, 07:45
- - VAI   Я использую по нескольку термостатов, градусники у...   Jan 10 2013, 05:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016