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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
kosyak©
сообщение Sep 2 2012, 18:33
Сообщение #2


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

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



Если Вам нужно быстро и I2C "не сильно нагружена" делайте программный ...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 19:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(kosyak© @ Sep 2 2012, 21:33) *
Если Вам нужно быстро и I2C "не сильно нагружена" делайте программный ...

Странно как-то это смотрится - при наличии аппаратного i2с, реализовывать программный...
Там драйвера от ST кривые или сама реализация в камне не того?
И такая ситууация не только с cortex-M0, но и с CM3/4?
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Sep 2 2012, 19:44
Сообщение #4


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

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



Тут главное слово быстро - я на CM3 проплюхался неделю. С примерами от СТ. И вроде запустишь, и вроде работает - а потом вылазит какаянить фигня. Как там в М0 я не знаю.
Go to the top of the page
 
+Quote Post
spectral1989
сообщение Sep 3 2012, 04:17
Сообщение #5


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

Группа: Свой
Сообщений: 76
Регистрация: 5-04-12
Из: Томск
Пользователь №: 71 210



скачайте последнюю либу на сайте http://st.com для своего проца, она должна называться как-то так: "stm32f0xx standard peripherals library". там есть папка с примерами, они 105% рабочие. проверено неоднократно.
Go to the top of the page
 
+Quote Post
kan35
сообщение Sep 3 2012, 05:08
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



У F0 новый I2C, говорят учли все недочеты прошлых версий.
Go to the top of the page
 
+Quote Post
Danis
сообщение Sep 3 2012, 07:39
Сообщение #7


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Цитата(_Артём_ @ Sep 2 2012, 22:31) *
Странно как-то это смотрится - при наличии аппаратного i2с, реализовывать программный...


Во всяком случае Errata sheet следует посмотреть, по I2С там не мало приведено ошибок.


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Sep 3 2012, 08:13
Сообщение #8


Участник
*

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



примеры были от stm320518-eval ...

перекомпилил с помощью gcc - не работает... ни термометр ни eeprom

тишина на выводах sda и scl

а когда брал и пытался под себя переделать функции то передавался один ноль... адрес слейва и остальное не видать....

в отличии от cortex-m3 там все по другому переделали...

у кого программный i2c есть для stm32 ??? киньте примерчик....

эратта есть но там че та про режим 10битного адреса только говорилось
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Sep 3 2012, 09:01
Сообщение #9


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

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



Могу дать в качестве примера. Без переделки мой вариант у вас врядли получится использовать.
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Sep 3 2012, 10:06
Сообщение #10


Участник
*

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



Цитата(kosyak© @ Sep 3 2012, 09:01) *
Могу дать в качестве примера. Без переделки мой вариант у вас врядли получится использовать.



буду рад любой помощи...

особенно интересует быстрое переключение пинов на "вход" и на "выход"
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Sep 3 2012, 10:21
Сообщение #11


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

Группа: Свой
Сообщений: 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
Сообщение #12


Участник
*

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



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

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



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

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

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


а функции действительно странно наименованы ... читабельность уменьшается ...))
Go to the top of the page
 
+Quote Post
kosyak©
сообщение Sep 3 2012, 11:29
Сообщение #13


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

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



Пины настроены как выход с открытым коллектором - Высокий уровень на них формируется с помощью внешнего подтягивающего резистора, а Низкий уровень одним из устройств на шине.
Т.е. если пишете 1 а читаете 0 - значит какое-то устройство на шине передает 0. Это называют Квазидвунаправленный порт.

Коду вообщем то все равно на каком процессоре работать - главное определить макросы для работы с пинами.

А функции.. дело в том что по этому модулю потом проходится скрипт, который меняет имена функций и переменных.

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


Участник
*

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



Цитата(kosyak© @ Sep 3 2012, 11:29) *
Пины настроены как выход с открытым коллектором - Высокий уровень на них формируется с помощью внешнего подтягивающего резистора, а Низкий уровень одним из устройств на шине.
Т.е. если пишете 1 а читаете 0 - значит какое-то устройство на шине передает 0. Это называют Квазидвунаправленный порт.

Коду вообщем то все равно на каком процессоре работать - главное определить макросы для работы с пинами.

А функции.. дело в том что по этому модулю потом проходится скрипт, который меняет имена функций и переменных.



кстати я правилно понал ??

#define I2CSWM_DIRECTION_TX 0x00
#define I2CSWM_DIRECTION_RX 0x01

#define I2CSWM_NACK 0x01
#define I2CSWM_ACK 0x00


если смотреть спецификацию и2с???

Go to the top of the page
 
+Quote Post
kosyak©
сообщение Sep 3 2012, 12:06
Сообщение #15


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

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



Копировал и забыл про эти константы. Вот

static const uint_fast8_t I2CSWM_DIRECTION_TX = 0;
static const uint_fast8_t I2CSWM_DIRECTION_RX = 1;

static const uint_fast8_t I2CSWM_NACK = 1;
static const uint_fast8_t I2CSWM_ACK = 0;

Можете использовать define, это не принципиально.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 11:01
Рейтинг@Mail.ru


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