03.12.2014, 18:12
|
|
Прохожий
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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.
|
|
|
|
19.12.2014, 10:57
|
|
Прохожий
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 градусов (
|
|
|
|
19.12.2014, 13:27
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: stm32f407 1-wire+DMA
Пользуйте анализатор. Осциллограф вам ничем не поможет.
|
|
|
|
23.12.2014, 15:38
|
|
Прохожий
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f407 1-wire+DMA
Сообщение от Easyrider83
|
Пользуйте анализатор. Осциллограф вам ничем не поможет.
|
Проблема в отсутствии анализатора(
|
|
|
|
23.12.2014, 16:17
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: stm32f407 1-wire+DMA
10 баксов стоит. Хосспади!!!
|
|
|
|
26.01.2015, 10:38
|
|
Прохожий
Регистрация: 03.12.2014
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: stm32f407 1-wire+DMA
проблема решилась после переписки всего с 0
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:01.
|
|