реклама на сайте
подробности

 
 
> stm32f0xx + i2c, проблемы с периферией... срочно нужна помощь...
Посторонним В...
сообщение Sep 2 2012, 09:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984



срочно нужна помощь...

веду разработку на cortex-m0 stm32f051... отладка stm32f0discovery

пытаюсь адекватно начать работать с I2C ... много гуглил но ни чего не нагуглил...

примеры от других процессоров не помогают stm32

люди жалуются на кривую периферию у stm32...

кто имел опыт с этим камнем отзовитесь... нужна ваша помошь!!!

примеры для работы с термодатчиком и памятью у меня не работают...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
kosyak©
сообщение Sep 3 2012, 10:21
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 179
Регистрация: 1-10-07
Из: НЧ
Пользователь №: 30 966



Ну вот собственно сам код. Не смотрите на несколько странное именование переменных и функций - переименуете на свой вкус.
Вам необходимо определить несколько макросов для работы с пинами SCL и SDA (установка/сброс/чтение).

Пины должны быть настроены как "Выход с открытым коллектором". Как это сделать смотрите даташит на свой процессор.

CODE


//Пины SCL и SDA должны быть настроены как GPIO_Mode_Out_OD
//
#define I2CSWM_DELAY 32

#define I2CSWM_SETSCL()
#define I2CSWM_CLEARSCL()
#define I2CSWM_GETSCL()


#define I2CSWM_SETSDA()
#define I2CSWM_CLEARSDA()
#define I2CSWM_GETSDA()



/*
*/
inline static void __i2cswm___delay( int n )
{
do
{
__no_operation();
}while( --n > 0 );
}

/*
*/
inline static void __i2cswm___start()
{
I2CSWM_SETSDA();
I2CSWM_SETSCL();

I2CSWM_CLEARSDA();
__i2cswm___delay(I2CSWM_DELAY);
I2CSWM_CLEARSCL();
}


/*
*/
inline static void __i2cswm___stop()
{
I2CSWM_CLEARSDA();
I2CSWM_SETSCL();
__i2cswm___delay(I2CSWM_DELAY);

I2CSWM_SETSDA();
}

/*
*/
inline static uint_fast8_t __i2cswm___clock()
{
uint_fast8_t l;
I2CSWM_SETSCL();
__i2cswm___delay(I2CSWM_DELAY);

l = I2CSWM_GETSDA() == Bit_SET ? 1 : 0;

I2CSWM_CLEARSCL();
__i2cswm___delay(I2CSWM_DELAY);
return l;
}

/*
*/
inline static uint_fast8_t __i2cswm___sendb(uint8_t b)
{
uint_fast8_t db = 0x80;
for(uint_fast8_t i = 0; i < 8; i++)
{
if( b & db )
{
I2CSWM_SETSDA();
}else
{
I2CSWM_CLEARSDA();
}
__i2cswm___clock();
db >>= 1;
}

/* Получим ACK */
I2CSWM_SETSDA(); /* отпускаем линию SDA */
return __i2cswm___clock();
}


/*
*/
inline static uint_fast8_t __i2cswm___recvb( uint_fast8_t ack )
{
uint_fast8_t rb = 0;
uint_fast8_t db = 0x80;
for(uint_fast8_t i = 0; i < 8; i++)
{
if( __i2cswm___clock() )
rb |= db;
db >>= 1;
}

if( ack == I2CSWM_ACK )
{
/* шлем ацк */
I2CSWM_CLEARSDA();
__i2cswm___clock();
I2CSWM_SETSDA();
}else
{
/* шлем нацк */
I2CSWM_SETSDA();

__i2cswm___clock();
}
return rb;
}



/*
*/
void __i2cswm___reset()
{
I2CSWM_SETSDA();
for(int i = 0; i < 15; i++)
{
I2CSWM_SETSCL();
__i2cswm___delay(I2CSWM_DELAY);
I2CSWM_CLEARSCL();
__i2cswm___delay(I2CSWM_DELAY);
}
I2CSWM_SETSDA();
I2CSWM_SETSCL();
}



/*
*/
int __i2cswm___recvex(const uint16_t saddr, uint8_t* lpdata1, uint32_t size1, uint8_t* lpdata2, uint32_t size2)
{
__i2cswm___start();
if( lpdata1 != NULL )
{
if( __i2cswm___sendb( saddr | I2CSWM_DIRECTION_TX) == I2CSWM_NACK )
{
__i2cswm___stop();
return FALSE;
}

for(int i = 0; i < size1; i++)
{
if( __i2cswm___sendb(*lpdata1++) == I2CSWM_NACK )
{
__i2cswm___stop();
return FALSE;
}
}
__i2cswm___start();
}

if( lpdata2 != NULL )
{
if( __i2cswm___sendb( saddr | I2CSWM_DIRECTION_RX) == I2CSWM_NACK )
{
__i2cswm___stop();
return FALSE;
}
I2CSWM_SETSCL();
for(int i = 1; i < size2; i++)
{
*lpdata2 = __i2cswm___recvb( I2CSWM_ACK );
lpdata2++;
}
*lpdata2 = __i2cswm___recvb( I2CSWM_NACK );
lpdata2++;
}
__i2cswm___stop();
return TRUE;
}



/*
*/
int __i2cswm___sendex(const uint16_t saddr, uint8_t* lpdata1, uint32_t size1, uint8_t* lpdata2, uint32_t size2)
{
__i2cswm___start();
if( lpdata1 != NULL )
{
if( __i2cswm___sendb( saddr | I2CSWM_DIRECTION_TX) == I2CSWM_NACK )
{
__i2cswm___stop();
return FALSE;
}

for(int i = 0; i < size1; i++)
{
if( __i2cswm___sendb(*lpdata1++) == I2CSWM_NACK )
{
__i2cswm___stop();
return FALSE;
}
}
}

if( lpdata2 != NULL )
{
for(int i = 0; i < size2; i++)
{
if( __i2cswm___sendb(*lpdata2++) == I2CSWM_NACK )
{
__i2cswm___stop();
return FALSE;
}
}
}
__i2cswm___stop();
return TRUE;
}




//использвоание на примере FRAM

static const uint8_t EEPROM_SADDR = 0xA0;

/*******************************************************************************
*
*******************************************************************************/
uint_fast8_t eeprom_read(uint16_t addr, uint8_t* buf, size_t size)
{
addr = SWP(addr);

uint_fast8_t rep_cnt = 3;
uint_fast8_t rc = FALSE;
while( --rep_cnt > 0 && rc == FALSE )
{
rc = i2c_recvex(EEPROM_SADDR, (uint8_t*)&addr, sizeof(addr), buf, size);
}
return rc;
}
/******************************************************************************/



/*******************************************************************************
*
*******************************************************************************/
uint_fast8_t eeprom_write(uint16_t addr, uint8_t* buf, size_t size)
{
addr = SWP(addr);
uint_fast8_t rep_cnt = 3;
uint_fast8_t rc = FALSE;
while( --rep_cnt > 0 && rc == FALSE )
{
rc = i2c_sendex(EEPROM_SADDR, (uint8_t*)&addr, sizeof(addr), buf, size);
}
return rc;
}
/******************************************************************************/



//и где то в программе

.....

TAPPPARAMS_C d_params_c;
if( eeprom_read(0, (uint8_t*)&d_params_c, sizeof(TAPPPARAMS_C)) )
{
}else
{
//error
}

.....


Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Sep 3 2012, 11:17
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984



Цитата(kosyak© @ Sep 3 2012, 10:21) *
Ну вот собственно сам код. Не смотрите на несколько странное именование переменных и функций - переименуете на свой вкус.
Вам необходимо определить несколько макросов для работы с пинами SCL и SDA (установка/сброс/чтение).

Пины должны быть настроены как "Выход с открытым коллектором". Как это сделать смотрите даташит на свой процессор.



серьезный код ))) я видел намного попроще для атмелов...

спасибо за помощь...

а каким образом пин прердергиваете на прием-передачу у линии SDA???


а функции действительно странно наименованы ... читабельность уменьшается ...))
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Посторонним В...   stm32f0xx + i2c   Sep 2 2012, 09:13
- - kosyak©   Если Вам нужно быстро и I2C "не сильно нагруж...   Sep 2 2012, 18:33
|- - _Артём_   Цитата(kosyak© @ Sep 2 2012, 21:33) Если ...   Sep 2 2012, 19:31
|- - Danis   Цитата(_Артём_ @ Sep 2 2012, 22:31) Стран...   Sep 3 2012, 07:39
- - kosyak©   Тут главное слово быстро - я на CM3 проплюхался не...   Sep 2 2012, 19:44
- - spectral1989   скачайте последнюю либу на сайте http://st.com для...   Sep 3 2012, 04:17
- - kan35   У F0 новый I2C, говорят учли все недочеты прошлых ...   Sep 3 2012, 05:08
- - Посторонним В...   примеры были от stm320518-eval ... перекомпилил с...   Sep 3 2012, 08:13
- - kosyak©   Могу дать в качестве примера. Без переделки мой ва...   Sep 3 2012, 09:01
|- - Посторонним В...   Цитата(kosyak© @ Sep 3 2012, 09:01) Могу ...   Sep 3 2012, 10:06
- - kosyak©   Пины настроены как выход с открытым коллектором - ...   Sep 3 2012, 11:29
|- - Посторонним В...   Цитата(kosyak© @ Sep 3 2012, 11:29) Пины ...   Sep 3 2012, 11:58
- - kosyak©   Копировал и забыл про эти константы. Вот static c...   Sep 3 2012, 12:06
- - Посторонним В...   #define I2C_SCL_PIN GPIO_Pin_0 #define I2C_S...   Sep 3 2012, 12:38
- - kosyak©   Думаю что у вас будет как то так #define I2C_SCL_...   Sep 3 2012, 13:28
- - Посторонним В...   УРРРРРРРРРРРРРРРРРРААААААААААААААААААААААААААА...   Sep 3 2012, 14:06
- - kosyak©   Хм..эт чего мой код заработал? Или удалось запусти...   Sep 3 2012, 14:22
|- - Посторонним В...   Цитата(kosyak© @ Sep 3 2012, 14:22) Хм..э...   Sep 3 2012, 15:16
- - kosyak©   Код то у меня есть...только он писан давно и для д...   Sep 3 2012, 15:47
|- - Посторонним В...   Цитата(kosyak© @ Sep 3 2012, 15:47) Код т...   Sep 3 2012, 16:33
- - Мур   Народ, бодаюсь с отладкой I2C для Кортекса М4 (EFM...   Aug 30 2014, 13:20
- - KnightIgor   Цитата(Мур @ Aug 30 2014, 15:20) Народ, б...   Aug 30 2014, 17:05
- - Мур   Цитата(KnightIgor @ Aug 30 2014, 21:05) Н...   Aug 31 2014, 07:37
- - KnightIgor   Цитата(Мур @ Aug 31 2014, 09:37) Спасибо...   Aug 31 2014, 09:34
- - Мур   Цитата(KnightIgor @ Aug 31 2014, 13:34) П...   Aug 31 2014, 13:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th August 2025 - 18:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016