Страница 1 из 1
I²C и STM32L
Добавлено: Вс авг 04, 2013 08:53:59
balmer
Тут пытаюсь прикрутить I2C к STM32L - капризная однако вещь. На частоте 100 кгц с внутренним pull-up резистором сигнал такой, что даже 3 V не успевает получиться. Провода у меня примерно по 10 см между устройствами. Можно поставить внешние 4.7 ком резисторы, но что-то как подумаю, что тогда при общении по I2C ток потребления будет больше, чем всего устройства, так сразу не хочется так делать. Может ну его нафиг i2C? SPI rules forever?
Да, и в I2C не силен. Можно ли ему выставить частоту 1000 герц работы? Я выставлял, фронты тогда красивые, даже что-то передается. Но общался между двумя STM микроконтроллерами. Непонятно можно ли с другой периферией общаться на такой низкой частоте.
Re: I2C и STM32L
Добавлено: Вс авг 04, 2013 10:17:50
Ser60
С внутренними pull-up резисторами хороших фронтов не получится, ставьте внешние на 4.7к. На частоте 100 кгц ток через них будет идти несколько мсек и на среднее токопотребление это влияет незначительно, если передача данных небольшая и не частая. Если бутете работать на 1000 гц (что возможно), то ток через внутренние резисторы будет раз в 10-100 меньше, зато длительность импульса будет в 100 раз большей и выигрыша никакого не получится.
Re: I2C и STM32L
Добавлено: Вт авг 06, 2013 20:54:39
balmer
Переделал схемку на SPI протокол, потому как он попроще. Все равно не работает.
Вот сижу, думаю в чем накосячил. Вроде сжечь не мог. Перепаивал уже несколько раз. Даже научился тестировать, что припаял правильно. А все равно не работает. Сигнал вроде на всех ножках такой как надо, но в ответ ничего не выдает эта микросхемка
В аттаче приложил схему и код.
Соединяю так с STM32F107
SCL - PA5
SDI - PA7
SDO - PA6
CS - PA2
Может у меня какая дурная ошибка, какой не вижу?
Re: I2C и STM32L
Добавлено: Вт авг 06, 2013 22:45:02
Neekeetos
balmer писал(а):Сигнал вроде на всех ножках такой как надо, но в ответ ничего не выдает эта микросхемка
полюбому надо вот так порты инициализировать:
Код: Выделить всё
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);//spi
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);//spi
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);//spi
инит спи у меня так сделан:
Код: Выделить всё
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
SPI_InitTypeDef SPI_InitStruct1;
SPI_InitStruct1.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;
SPI_InitStruct1.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct1.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct1.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct1.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct1.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct1.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStruct1.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct1.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStruct1);
SPI_CalculateCRC(SPI1,DISABLE);
SPI_Cmd(SPI1, ENABLE);
передача/прием байта :
Код: Выделить всё
inline int spiLoopByte(uint8_t data)
{
uint8_t RxData = 0;
while( ! (SPI1->SR & SPI_SR_TXE ) ) ;
SPI1->DR = data ;
while( ! (SPI1->SR & SPI_SR_RXNE) );
data = SPI1->DR; // read rx buf
return (data);
}
может поможет

Re: I2C и STM32L
Добавлено: Вт авг 06, 2013 23:10:03
balmer
Neekeetos писал(а):
полюбому надо вот так порты инициализировать:
Код: Выделить всё
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);//spi
GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);//spi
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);//spi
Это для других микроконтроллеров. Твой код подойдет для STM32L и STM32F4.
Полярносить там по даташиту high.
Re: I2C и STM32L
Добавлено: Ср авг 07, 2013 07:33:27
Neekeetos
balmer писал(а):Это для других микроконтроллеров. Твой код подойдет для STM32L и STM32F4.
Полярносить там по даташиту high.
Это рабочий код из проекта на 32l151, у тебя в названии темы указано 32L. Инициализацию spi понятное дело надо подгонять под себя, там кроме полярности еще например частота работы другая.