I²C и STM32L

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Тут пытаюсь прикрутить I2C к STM32L - капризная однако вещь. На частоте 100 кгц с внутренним pull-up резистором сигнал такой, что даже 3 V не успевает получиться. Провода у меня примерно по 10 см между устройствами. Можно поставить внешние 4.7 ком резисторы, но что-то как подумаю, что тогда при общении по I2C ток потребления будет больше, чем всего устройства, так сразу не хочется так делать. Может ну его нафиг i2C? SPI rules forever?

Да, и в I2C не силен. Можно ли ему выставить частоту 1000 герц работы? Я выставлял, фронты тогда красивые, даже что-то передается. Но общался между двумя STM микроконтроллерами. Непонятно можно ли с другой периферией общаться на такой низкой частоте.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3793
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

С внутренними pull-up резисторами хороших фронтов не получится, ставьте внешние на 4.7к. На частоте 100 кгц ток через них будет идти несколько мсек и на среднее токопотребление это влияет незначительно, если передача данных небольшая и не частая. Если бутете работать на 1000 гц (что возможно), то ток через внутренние резисторы будет раз в 10-100 меньше, зато длительность импульса будет в 100 раз большей и выигрыша никакого не получится.
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Переделал схемку на SPI протокол, потому как он попроще. Все равно не работает.
Изображение

Вот сижу, думаю в чем накосячил. Вроде сжечь не мог. Перепаивал уже несколько раз. Даже научился тестировать, что припаял правильно. А все равно не работает. Сигнал вроде на всех ножках такой как надо, но в ответ ничего не выдает эта микросхемка :cry:

В аттаче приложил схему и код.

Соединяю так с STM32F107
SCL - PA5
SDI - PA7
SDO - PA6
CS - PA2

Может у меня какая дурная ошибка, какой не вижу?
Вложения
spi_test.c
Тестовая програмка
(2.44 КБ) 349 скачиваний
pressure.pdf
Мелкосхемка
(52.48 КБ) 216 скачиваний
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

balmer писал(а):Сигнал вроде на всех ножках такой как надо, но в ответ ничего не выдает эта микросхемка :cry:
полюбому надо вот так порты инициализировать:

Код: Выделить всё

	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);
}
может поможет :)
Информация по RLC mini находится >тут<
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение 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.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

balmer писал(а):Это для других микроконтроллеров. Твой код подойдет для STM32L и STM32F4.
Полярносить там по даташиту high.
Это рабочий код из проекта на 32l151, у тебя в названии темы указано 32L. Инициализацию spi понятное дело надо подгонять под себя, там кроме полярности еще например частота работы другая.
Информация по RLC mini находится >тут<
Контактная информация:
Реклама
Ответить

Вернуться в «ARM»