|
STM32 USART и DS18B20, траблы с приемо-передачей байтов |
|
|
|
Aug 19 2011, 19:53
|
Группа: Участник
Сообщений: 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(); } }
|
|
|
|
|
 |
Ответов
|
Aug 22 2011, 11:43
|
Группа: Участник
Сообщений: 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(); }
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|