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

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

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

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

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

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


Ответ
Опции темы
Непрочитано 04.10.2011, 21:18   #871
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию 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)
Спасибо, я буду читать и перечитывать ваше сообщение, чтобы достигнуть просветления )
Реклама:

Последний раз редактировалось dccharacter; 04.10.2011 в 21:21.
dccharacter вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 22:34   #872
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от Easyrider83 Посмотреть сообщение
Разобрался. Полная инициализация не нужна.
Попробуй после генерации STOP-ивента сделать следующее:
Код:
while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
Если я правильно понимаю, как раз на этом вешается - на генерации нового старта/рестарта, когда еще стоп не отработал.
dccharacter вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 22:36   #873
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

dccharacter, да я пробовал паузу 100 мс делать. Не помогает.
Easyrider83 вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 22:48   #874
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию 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; }
Слуш, я чего-то вообще не найду где ты ЧИТАЕШЬ байт
dccharacter вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 23:06   #875
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от dccharacter Посмотреть сообщение
Слуш, я чего-то вообще не найду где ты ЧИТАЕШЬ байт
Да это название процедуры кривым получилось. Она вообще-то EE24_WriteByte называется. Я там только пишу. Ничего не читаю.
Easyrider83 вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 23:07   #876
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от Easyrider83 Посмотреть сообщение
Да это название процедуры кривым получилось. Она вообще-то EE24_WriteByte называется. Я там только пишу. Ничего не читаю.
А давай-ка его код сюда
dccharacter вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 23:28   #877
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию 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.
Easyrider83 вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 23:37   #878
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - замени все условия на циклы

т.е. не чекай однократно, а жди пока выполнится предыдущая инструкция и включится нужный режим.
dccharacter вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 23:40   #879
dccharacter
Временная регистрация
 
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
dccharacter на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Вот это хорошо:

Код:
I2C_GenerateSTOP(I2Cx, ENABLE);														 /* Send STOP Condition */
	
	I2C_AcknowledgeConfig(I2Cx, DISABLE);

	tmp=I2C_ReceiveData(I2Cx);
Шлешь стоп, а потом шлешь накки/читаешь байт
dccharacter вне форума   Ответить с цитированием
Непрочитано 04.10.2011, 23:41   #880
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от dccharacter Посмотреть сообщение
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); - замени все условия на циклы

т.е. не чекай однократно, а жди пока выполнится предыдущая инструкция и включится нужный режим.
Я наоборот избавился от вечного ожидания. Смотрите внимательнее код.
Код:
while ((tmr!=Max_I2C_delay_cls)&(err))
Easyrider83 вне форума   Ответить с цитированием
Ответ

Закладки


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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Школа АRMрестлинга Uragan90 Микроконтроллеры, АЦП, память и т.д 54 22.08.2011 16:13
ARM Cortex M3 + Linux SiMiLya Микроконтроллеры, АЦП, память и т.д 10 17.06.2011 17:20
Помогите с STM32 - очень нужно... yakuzaa Микроконтроллеры, АЦП, память и т.д 60 04.08.2010 11:04
Как добавить поддержку для STM32 SFHK Микроконтроллеры, АЦП, память и т.д 11 18.12.2009 18:09


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


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