Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 03.12.2014, 18:12  
wr49
Прохожий
 
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wr49 на пути к лучшему
По умолчанию stm32f407 1-wire+DMA

Всем доброго времени суток столкнулся с проблемой при работе с 1-wire;
Проблема заключается в следующем DMA не правильно считывает данные с линии
к примеру код семейства датчика DS18B20 вместо 0x28h читает 0x19h
с чтением температуры тоже проблема , показывает более 100 градусов при реальных 27
Помогите найти ошибку.
Инициализация
Код:
uint8_t OW_Init() {
	GPIO_InitTypeDef GPIO_InitStructureTX;
	GPIO_InitTypeDef GPIO_InitStructureRX;
	USART_InitTypeDef USART_InitStructure;
	

		RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,
				ENABLE);
	//PD5-Tx
	//PD6-Rx
	
		//Tx
		GPIO_InitStructureTX.GPIO_Pin = GPIO_Pin_5;
		GPIO_InitStructureTX.GPIO_Mode = GPIO_Mode_AF;
		GPIO_InitStructureTX.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructureTX.GPIO_OType = GPIO_OType_OD;
		GPIO_InitStructureTX.GPIO_PuPd = GPIO_PuPd_UP;
		GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USA  RT2);
	
		//Rx 
		GPIO_InitStructureRX.GPIO_Pin = GPIO_Pin_6;
		GPIO_InitStructureRX.GPIO_Mode = GPIO_Mode_IN;
		GPIO_InitStructureRX.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructureRX.GPIO_OType = GPIO_OType_PP;
		GPIO_InitStructureRX.GPIO_PuPd = GPIO_PuPd_NOPULL;

		GPIO_Init(GPIOD, &GPIO_InitStructureTX);
		GPIO_Init(GPIOD, &GPIO_InitStructureRX);

		RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);


	USART_InitStructure.USART_BaudRate = 115200;
	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_Tx | USART_Mode_Rx;
	USART_DeInit(USART2);
	USART_Init(USART2, &USART_InitStructure);
	USART_HalfDuplexCmd(USART2, ENABLE);
	USART_Cmd(USART2, ENABLE);
	USART_ClearFlag(USART2, USART_FLAG_FE | USART_FLAG_TC );
	return OW_OK;
}
Reset
Код:
 
uint8_t OW_Reset() {
	uint8_t ow_presence;
	USART_InitTypeDef USART_InitStructure;

	USART_InitStructure.USART_BaudRate = 9600;
	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_Tx | USART_Mode_Rx;
	USART_DeInit(USART2);
	USART_Init(USART2, &USART_InitStructure);
	USART_HalfDuplexCmd(USART2, ENABLE);
	USART_Cmd(USART2, ENABLE);
	USART_ClearFlag(USART2, USART_FLAG_FE | USART_FLAG_TC );

	USART_ClearFlag(USART2, USART_FLAG_TC);
	USART_SendData(USART2, 0xf0);
	while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {

		taskYIELD();

	}

	ow_presence = USART_ReceiveData(USART2);

	USART_InitStructure.USART_BaudRate = 115200;
	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_Tx | USART_Mode_Rx;
	USART_DeInit(USART2);
	USART_Init(USART2, &USART_InitStructure);
	USART_HalfDuplexCmd(USART2, ENABLE);
	USART_Cmd(USART2, ENABLE);
	USART_ClearFlag(USART2, USART_FLAG_FE | USART_FLAG_TC );

	if (ow_presence != 0xf0) {
		return OW_OK;
	}

	return OW_NO_DEVICE;
}
ну и сама отправка
Код:
uint8_t OW_Send(uint8_t sendReset, uint8_t *command, uint8_t cLen,
		uint8_t *data, uint8_t dLen, uint8_t readStart) {
		DMA_InitTypeDef DMA_InitStructure;
	
	if (sendReset == OW_SEND_RESET) {
		if (OW_Reset() == OW_NO_DEVICE) {
			return OW_NO_DEVICE;
		}
	}

	while (cLen › 0) {

		OW_toBits(*command, ow_buf);
		command++;
		cLen--;


	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
		// DMA RX
					DMA_DeInit(DMA1_Stream5);//
					DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART2-›DR);//
					DMA_InitStructure.DMA_Channel = DMA_Channel_4;//
					DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) ow_buf;//
					DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//
					DMA_InitStructure.DMA_BufferSize = 8;		//
					DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
					DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;   
					DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
					DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
					DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
					DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;			
					DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;					
					DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
					DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
					DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
					DMA_Init(DMA1_Stream5, &DMA_InitStructure);

	

		// DMA TX
					DMA_DeInit(DMA1_Stream6);
					DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) ow_buf;
					DMA_InitStructure.DMA_BufferSize = 8;
					DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(USART2-›DR);
					DMA_InitStructure.DMA_Channel = DMA_Channel_4;
					DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
					DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
					DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
					DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
					DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
					DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
					DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
					DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
					DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;					
					DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
					DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
					DMA_Init(DMA1_Stream6, &DMA_InitStructure);;


		
		USART_DMACmd(USART2, USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE);
		USART_ClearFlag(USART2, USART_FLAG_RXNE | USART_FLAG_TC | USART_FLAG_TXE);
		DMA_Cmd(DMA1_Stream6, ENABLE);
		DMA_Cmd(DMA1_Stream5, ENABLE);


		while (DMA_GetFlagStatus(DMA1_Stream5,DMA_FLAG_TCIF6) == RESET){
			taskYIELD();
		}

		//  DMA
		DMA_Cmd(DMA1_Stream5, DISABLE);
		DMA_Cmd(DMA1_Stream6, DISABLE);
		USART_DMACmd(OW_USART, USART_DMAReq_Tx | USART_DMAReq_Rx, DISABLE);


		if (readStart == 0 && dLen › 0) {
			*data = OW_toByte(ow_buf);
			data++;
			dLen--;
		} else {
			if (readStart != OW_NO_READ) {
				readStart--;
			}
		}
	}

	return OW_OK;
}

преобразование
Код:
void OW_toBits(uint8_t ow_byte, uint8_t *ow_bits) {
	uint8_t i;
	for (i = 0; i ‹ 8; i++) {
		if (ow_byte & 0x01) {
			*ow_bits = OW_1;
		} else {
			*ow_bits = OW_0;
		}
		ow_bits++;
		ow_byte = ow_byte ›› 1;
	}
}


uint8_t OW_toByte(uint8_t *ow_bits) {
	uint8_t ow_byte, i;
	ow_byte = 0;
	for (i = 0; i ‹ 8; i++) {
		ow_byte = ow_byte ›› 1;
		if (*ow_bits == OW_R_1) {
			ow_byte |= 0x80;
		}
		ow_bits++;
	}

	return ow_byte;
}
на OW_Send(OW_SEND_RESET, "x33\xff\xff\xff\xff\xff\xff\xff\xff",9, (uint8_t*)buf,8, 1);

отвечает 0x19 0x41 0xf9 0xFF 0xFF 0xFF 0xFF 0xFF
Реклама:

Последний раз редактировалось wr49; 03.12.2014 в 18:16.
wr49 вне форума  
Непрочитано 19.12.2014, 10:57  
wr49
Прохожий
 
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wr49 на пути к лучшему
По умолчанию Re: stm32f407 1-wire+DMA

осциллографом посмотрел что творится во время снятия температуры
uint8_t buffer[10]={0xCC,0x44};
OW_Send(1,buffer ,2,result,0,OW_NO_READ);
for (i=0;i‹100000;i++);
buffer[0]=0xCC;
buffer[1]=0xBE;

for(i=2;i‹10;i++)
{buffer[i]=0xFF;}
OW_Send(1,buffer ,10,(uint8_t*)result,8,2);

считывает более 100 градусов (

wr49 вне форума  
Непрочитано 19.12.2014, 13:27  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: stm32f407 1-wire+DMA

Пользуйте анализатор. Осциллограф вам ничем не поможет.
Easyrider83 вне форума  
Непрочитано 23.12.2014, 15:38  
wr49
Прохожий
 
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wr49 на пути к лучшему
По умолчанию Re: stm32f407 1-wire+DMA

Сообщение от Easyrider83 Посмотреть сообщение
Пользуйте анализатор. Осциллограф вам ничем не поможет.
Проблема в отсутствии анализатора(
wr49 вне форума  
Непрочитано 23.12.2014, 16:17  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: stm32f407 1-wire+DMA

10 баксов стоит. Хосспади!!!
Easyrider83 вне форума  
Непрочитано 26.01.2015, 10:38  
wr49
Прохожий
 
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
wr49 на пути к лучшему
По умолчанию Re: stm32f407 1-wire+DMA

проблема решилась после переписки всего с 0
wr49 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
STM32 - Tips 'N Tricks nahimovv ARM 8 08.08.2016 14:35
STM32F103, непонятки с DMA eddy ARM 124 18.11.2014 15:24
Tim19 -> DMA -> значение ADC в memory kvark85 ARM 6 03.06.2014 15:00
STM32 ADC + DMA в циклическом режиме Nik_UFO Микроконтроллеры, АЦП, память и т.д 4 24.02.2012 18:49
DMA в ATxmega vav618 Микроконтроллеры, АЦП, память и т.д 1 03.04.2010 10:57


Часовой пояс GMT +4, время: 11:33.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot