04.10.2011, 21:18
|
#871
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от Oleg Galizin
|
Если посмотрите исходник stm32f10x_tim.c то обнаружите, что разницы в этих функциях вообще нет - она сбрасывает биты в регистре SR.
|
Да, люди явно старались добавить ясности но вместо этого внесли путаницу:
Код:
|
#define TIM_IT_Update ((uint16_t)0x0001)
#define TIM_IT_CC1 ((uint16_t)0x0002)
#define TIM_IT_CC2 ((uint16_t)0x0004)
#define TIM_IT_CC3 ((uint16_t)0x0008)
#define TIM_IT_CC4 ((uint16_t)0x0010)
#define TIM_IT_COM ((uint16_t)0x0020)
#define TIM_IT_Trigger ((uint16_t)0x0040)
#define TIM_IT_Break ((uint16_t)0x0080)
#define TIM_FLAG_Update ((uint16_t)0x0001)
#define TIM_FLAG_CC1 ((uint16_t)0x0002)
#define TIM_FLAG_CC2 ((uint16_t)0x0004)
#define TIM_FLAG_CC3 ((uint16_t)0x0008)
#define TIM_FLAG_CC4 ((uint16_t)0x0010)
#define TIM_FLAG_COM ((uint16_t)0x0020)
#define TIM_FLAG_Trigger ((uint16_t)0x0040)
#define TIM_FLAG_Break ((uint16_t)0x0080)
#define TIM_FLAG_CC1OF ((uint16_t)0x0200)
#define TIM_FLAG_CC2OF ((uint16_t)0x0400)
#define TIM_FLAG_CC3OF ((uint16_t)0x0800)
#define TIM_FLAG_CC4OF ((uint16_t)0x1000) |
Спасибо, я буду читать и перечитывать ваше сообщение, чтобы достигнуть просветления ![Весело](images/smilies/icon_laugh.gif) )
Последний раз редактировалось dccharacter; 04.10.2011 в 21:21.
|
|
|
|
04.10.2011, 22:34
|
#872
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
Разобрался. Полная инициализация не нужна.
|
Попробуй после генерации STOP-ивента сделать следующее:
Код:
|
while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); |
Если я правильно понимаю, как раз на этом вешается - на генерации нового старта/рестарта, когда еще стоп не отработал.
|
|
|
|
04.10.2011, 22:36
|
#873
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
dccharacter, да я пробовал паузу 100 мс делать. Не помогает.
|
|
|
|
04.10.2011, 22:48
|
#874
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
Код:
|
int EE24ReadWrite(I2C_TypeDef* I2Cx, char val, int WriteAddr) { if(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)){return I2C_BUS_BUSY;} /* While the bus is busy */ I2C_GenerateSTART(I2Cx, ENABLE); /* Send START condition */ if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_MODE_SELEC T)){return I2C_ERROR;} /* Test on EV5 and clear it */ I2C_Send7bitAddress(I2Cx, EEPROM_HW_ADDRESS, I2C_Direction_Transmitter); /* Send EEPROM address for write */ if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_TRANSMITTE R_MODE_SELECTED)) /* Test on EV6 and clear it */ {return I2C_ERROR;} I2C_SendData(I2Cx, (char)((WriteAddr & 0xFF00) ›› 8)); /* Send the EEPROM's internal address to write to : MSB of the address first */ if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */ I2C_SendData(I2Cx, (char)(WriteAddr & 0x00FF)); /* Send the EEPROM's internal address to write to : LSB of the address */ if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */ I2C_SendData(I2Cx, val); if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */ I2C_GenerateSTOP(I2Cx, ENABLE); /* Send STOP condition */ //delay between write and read...not less 4ms return 0; } |
|
Слуш, я чего-то вообще не найду где ты ЧИТАЕШЬ байт
|
|
|
|
04.10.2011, 23:06
|
#875
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от dccharacter
|
Слуш, я чего-то вообще не найду где ты ЧИТАЕШЬ байт
|
Да это название процедуры кривым получилось. Она вообще-то EE24_WriteByte называется. Я там только пишу. Ничего не читаю.
|
|
|
|
04.10.2011, 23:07
|
#876
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
Да это название процедуры кривым получилось. Она вообще-то EE24_WriteByte называется. Я там только пишу. Ничего не читаю.
|
А давай-ка его код сюда
|
|
|
|
04.10.2011, 23:28
|
#877
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от dccharacter
|
А давай-ка его код сюда
|
Уболтали. Вот весь модуль:
Код:
|
#include "24xxx.h"
#include "LED.h"
#define EEPROM_HW_ADDRESS 0xA0
void EE24Init(I2C_TypeDef* I2Cx)
{
GPIO_InitTypeDef GPIO_InitStruct;
I2C_InitTypeDef I2C_InitStructure;
if (I2Cx==I2C1)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE );}
else
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE );}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
if (I2Cx==I2C1)
{GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7;} //I2C1 PINs
else
{GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_11;} //I2C2 PINs
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
I2C_DeInit(I2Cx);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0xB0;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100kHz */
I2C_Init(I2Cx, &I2C_InitStructure);
I2C_AcknowledgeConfig(I2Cx, ENABLE);
}
int EE24WriteByte(I2C_TypeDef* I2Cx, char val, int WriteAddr)
{
I2C_Cmd(I2Cx, ENABLE);
if(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)){return I2C_BUS_BUSY;} /* While the bus is busy */
I2C_GenerateSTART(I2Cx, ENABLE); /* Send START condition */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_MODE_SELEC T)){return I2C_ERROR;} /* Test on EV5 and clear it */
I2C_Send7bitAddress(I2Cx, EEPROM_HW_ADDRESS, I2C_Direction_Transmitter); /* Send EEPROM address for write */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_TRANSMITTE R_MODE_SELECTED)) /* Test on EV6 and clear it */
{return I2C_ERROR;}
I2C_SendData(I2Cx, (char)((WriteAddr & 0xFF00) ›› 8)); /* Send the EEPROM's internal address to write to : MSB of the address first */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */
I2C_SendData(I2Cx, (char)(WriteAddr & 0x00FF)); /* Send the EEPROM's internal address to write to : LSB of the address */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */
I2C_SendData(I2Cx, val);
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */
I2C_GenerateSTOP(I2Cx, ENABLE); /* Send STOP condition */ //delay between write and read...not less 4ms
I2C_Cmd(I2Cx, DISABLE);
return 0;
}
int EE24ReadByte(I2C_TypeDef* I2Cx, int ReadAddr)
{
char tmp=0;
I2C_Cmd(I2Cx, ENABLE);
if(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)){I2C_GenerateSTOP(I2Cx, ENABLE); return I2C_BUS_BUSY;} /* While the bus is busy */
I2C_GenerateSTART(I2C1, ENABLE); /* Send START condition */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_MODE_SELEC T)){return I2C_ERROR;} /* Test on EV5 and clear it */
I2C_Send7bitAddress(I2Cx, EEPROM_HW_ADDRESS, I2C_Direction_Transmitter); /* Send EEPROM address for write */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_TRANSMITTE R_MODE_SELECTED)) /* Test on EV6 and clear it */
{return I2C_ERROR;}
I2C_SendData(I2C1, (char)((ReadAddr & 0xFF00) ›› 8)); /* Send the EEPROM's internal address to read from: MSB of the address first */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */
I2C_SendData(I2C1, (char)( ReadAddr & 0x00FF)); /* Send the EEPROM's internal address to read from: LSB of the address */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_TRANS MITTED)){return I2C_ERROR;} /* Test on EV8 and clear it */
I2C_GenerateSTART(I2C1, ENABLE); /* Send STRAT condition a second time */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_MODE_SELEC T)){return I2C_ERROR;} /* Test on EV5 and clear it */
I2C_Send7bitAddress(I2Cx, EEPROM_HW_ADDRESS, I2C_Direction_Receiver); /* Send EEPROM address for read */
if(I2C_Wait_Event(I2Cx,I2C_EVENT_MASTER_BYTE_RECEI VED)){return I2C_ERROR;} /* Test on EV6 and clear it */
I2C_GenerateSTOP(I2Cx, ENABLE); /* Send STOP Condition */
I2C_AcknowledgeConfig(I2Cx, DISABLE);
tmp=I2C_ReceiveData(I2Cx);
I2C_Cmd(I2Cx, DISABLE);
return tmp;
}
char I2C_Wait_Event(I2C_TypeDef* I2Cx, long event)
{
long tmr = 0;
long err = 0xFF;
while ((tmr!=Max_I2C_delay_cls)&(err))
{
tmr++;
err=!I2C_CheckEvent(I2Cx, event);
}
if (tmr==Max_I2C_delay_cls)
{
led_flash(BLUE_LED);
return 1; //ERROR
}
else
{return 0;} //OK
}
void EE24PrintString(I2C_TypeDef* I2Cx, char * string, int adrs)
{
int cnt=adrs;
while (*string != 0x00)
{
EE24WriteByte(I2Cx, *string++,cnt);
cnt++;
delay_ms(EE24_Write_Delay_ms);
}
} |
Ну и хедер:
Код:
|
#include "stm32f10x_type.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#include "delays.h"
#define Max_I2C_delay_cls 100000
#define I2C_ERROR 0xFFFF
#define I2C_BUS_BUSY 0xFFEE
#define EE24_Write_Delay_ms 5
void EE24Init(I2C_TypeDef* I2Cx);
int EE24WriteByte(I2C_TypeDef* I2Cx, char val, int WriteAddr);
int EE24ReadByte(I2C_TypeDef* I2Cx, int ReadAddr);
char I2C_Wait_Event(I2C_TypeDef* I2Cx, long event);
void EE24PrintString(I2C_TypeDef* I2Cx, char * string, int adrs); |
Последний раз редактировалось Easyrider83; 04.10.2011 в 23:33.
|
|
|
|
04.10.2011, 23:37
|
#878
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - замени все условия на циклы
т.е. не чекай однократно, а жди пока выполнится предыдущая инструкция и включится нужный режим.
|
|
|
|
04.10.2011, 23:40
|
#879
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Вот это хорошо:
Код:
|
I2C_GenerateSTOP(I2Cx, ENABLE); /* Send STOP Condition */
I2C_AcknowledgeConfig(I2Cx, DISABLE);
tmp=I2C_ReceiveData(I2Cx); |
Шлешь стоп, а потом шлешь накки/читаешь байт
|
|
|
|
04.10.2011, 23:41
|
#880
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от dccharacter
|
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - замени все условия на циклы
т.е. не чекай однократно, а жди пока выполнится предыдущая инструкция и включится нужный режим.
|
Я наоборот избавился от вечного ожидания. Смотрите внимательнее код.
Код:
|
while ((tmr!=Max_I2C_delay_cls)&(err)) |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:34.
|
|