Пытаюсь завести 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();
}
}