Easyelectronics.ru

Электроника для всех
Текущее время: 19 фев 2018, 00:35

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: STM8L + SPI
СообщениеДобавлено: 04 июл 2012, 13:13 
Здравствуйте!

Зарегистрирован: 28 фев 2012, 02:17
Сообщения: 3
На руках платка STM8L-DISCOVERY, пытаюсь настроить контроллер на прочитать данные по SPI с EEPROMа (ATMEL AT25256B).

Предисловие.... Как бы все получилось.... настроил SPI, отправил запрос.... и даже увидел нужный мне ответ на экране осцилоскопа) .... НО, В регистр SP1_DR, куда должен попадать результат (который, напомню, я ВИЖУ на линии) каждый раз попадает 0 !!! Все флаги сбрасываются и поднимаются, как требуется....

И так включаю SPI и настраиваю на режим bidirectional mode....transmitting)

Код:
SYSCFG_RMPCR1|= 1<<7;      //SYSCFG remap control register
  CLK_PCKENR1 |= 1<<4;                //clock   
  SPI1_CR1 |= ((1<<4)|(1<<5));      //BR[2:0]: Baud rate control fSYSCLK/128
  SPI1_CR1 |= ((0<<1)|(0<<0));     //CPOL and CPHA
  SPI1_CR1 |= (0<<7);                  //LSBFIRST
  SPI1_CR2 |=(1<<1);                  //SSM: Software slave management enabled
  SPI1_CR1 |= (1<<2);                 //Master configuration
 
  SPI1_CR2 |=((1<<6)|(1<<7));      //BDOE: transmitting
  SPI1_CR2 |=(1<<0);                   //SSI: Internal slave select
  SPI1_CR1 |= (1<<6);                  //SPI Enable


И, собственно говоря, передача... запрос формата "03 00 00", где 03 - инстукция "read", а 00 00 - адрес EEPROMA.

Код:
SPI1_DR = 0x03;
  while (SPI1_SR_TXE != 1) {};
 
  SPI1_DR = 0x0;
  while (SPI1_SR_TXE != 1) {};
 
  SPI1_DR = 0x0;
  while (SPI1_SR_TXE != 1) {};
 
  while (SPI1_SR_BSY != 0) {}


Ждем пока запрос отправится и SPI1_DR освободится.

Меняю режим на прием!
Код:
SPI1_CR2_BDOE = 0;      //BDOE: receiving


И наконец читаю ...

Код:
while (SPI1_SR_RXNE != 1){};
  rslt[0] = SPI1_DR;
  while (SPI1_SR_RXNE != 1){};
  rslt[1] = SPI1_DR;
  while (SPI1_SR_RXNE != 1){};
  rslt[2] = SPI1_DR;


кстати... конфигурирую пины следующим образом...

Код:
PC_DDR_DDR6 = 1; PC_CR1_C16 = 1; PC_CR2_C26 = 0; //SCK
   PA_DDR_DDR3 = 1; PA_CR1_C13 = 0; PA_CR2_C23 = 0; //MOSI
   PA_DDR_DDR2 = 0; PA_CR1_C12 = 0; //PA_CR2_C22 = 0; //MISO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 14 авг 2012, 00:08 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 27 фев 2011, 21:32
Сообщения: 118
А может надо ждать приема байта по SPI, типа такого:
Код:
unsigned char TX(unsigned char data){
  SPI_DR = data;
  while(!(SPI_SR & MASK_SPI_SR_RXNE));
  return SPI_DR;
}

а потом байт забирать из этой функции...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 14 авг 2012, 13:37 
Заглядывает иногда

Зарегистрирован: 12 авг 2012, 14:58
Сообщения: 43
Andrii писал(а):
Меняю режим на прием!
И наконец читаю ...

Почитайте раз пять даташиты на обе микрухи, тогда может поймёте, что такое BDOE и что он вам и нах не впёрся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 26 сен 2012, 14:47 
Старожил
Аватара пользователя

Зарегистрирован: 22 мар 2010, 21:38
Сообщения: 1623
Откуда: Нижний Тагил
А у вас SPI ножками дрыгает?

_________________
Электроника для модельных железных дорог. DCC и разные чудеса с ним.
XpressNet не так уж и страшно, как казалось на первый взгляд...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 10 окт 2012, 16:02 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
Тоже возник вопрос на подобную тему, но работать собираюсь с SRAM.

В интерфейсе SPI STM8 имеется ножка переключения SPI_NSS.
Как я понял она отвечает за переключение Master/Slave.

Если ли в моем случае она не используется, то что с ней делать?
Достаточно ли будет просто не объявлять альтернативную функцию на эту ножку? И можно ли будет этой лапкой пользоваться как простой GPIO?

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 10 окт 2012, 16:54 
Супермодератор
Аватара пользователя

Зарегистрирован: 23 апр 2010, 12:58
Сообщения: 5893
Откуда: Москва/Саратов
Можно юзать как gpio, надо только настроить SPI на режим программного NSS

_________________
http://d.64h.me/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 10 окт 2012, 18:31 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
Спасибо большое! Теперь со спокойной душой буду печатку разводить.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 10 окт 2012, 22:31 
Старожил
Аватара пользователя

Зарегистрирован: 22 мар 2010, 21:38
Сообщения: 1623
Откуда: Нижний Тагил
Когда я использую эту ножку как захочу, у меня SPI выдает радужные глюки.

_________________
Электроника для модельных железных дорог. DCC и разные чудеса с ним.
XpressNet не так уж и страшно, как казалось на первый взгляд...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 11 окт 2012, 16:29 
Старожил

Зарегистрирован: 08 окт 2012, 00:25
Сообщения: 871
"Глюк есть субстанция противоположная полученным знаниям"(С)
Читайте даташит в области Soft NSS и "радужные глюки" превратятся в "радужные возможности"...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 02 ноя 2012, 15:33 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
Добыл микросхемок памяти, начал эксперименты...
Инициализация SPI:
Код:
  SPI_DeInit(); 
  SPI_Init (
    SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_128, SPI_MODE_MASTER,
    SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE,
    SPI_DATADIRECTION_2LINES_FULLDUPLEX, SPI_NSS_SOFT, 0x07);
  SPI_Cmd(ENABLE);

Чтение статуса микросхемы памяти:
  SPI_SendData(0x05);
  while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
  while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);
  data = SPI_ReceiveData();


Вроде все по фэншую(даташиту), но в итоге получается:
- МК ведет тактирование(по SCK) только при передаче данных
- Когда данные нужно принимать, тактирования нет!
Картинка из даташита на память (чтение статуса):
Вложение:
ds.png
ds.png [ 30.59 Кб | Просмотров: 13794 ]

Скрин анализатора:
Вложение:
screenshot.png
screenshot.png [ 24.7 Кб | Просмотров: 13794 ]

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 02 ноя 2012, 19:33 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
DimanVIP писал(а):
Вроде все по фэншую(даташиту), но в итоге получается:
- МК ведет тактирование(по SCK) только при передаче данных
- Когда данные нужно принимать, тактирования нет!
Картинка из даташита на память (чтение статуса):


Что бы что то принять, надо хоть что то передать.Хоть те же нули.
Вы работу SPI осознаете ? Или вы думаете slave вам их выталкивать будет самотактируясь ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 02 ноя 2012, 21:00 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
dosikus_2 писал(а):
Что бы что то принять, надо хоть что то передать.Хоть те же нули.
Вы работу SPI осознаете ? Или вы думаете slave вам их выталкивать будет самотактируясь ?

Уже очень хорошо :)

Плюнул я на этот полный дуплекс. Переделал на двунаправленную линию.
Вроде все пошло, и данные бегают.

Но вот только в приемном буфере всегда ноль.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 02 ноя 2012, 23:28 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
DimanVIP писал(а):
Вроде все пошло, и данные бегают.
Но вот только в приемном буфере всегда ноль.


Ну дык - код в студию ...

PS. На всякий случай- лапы правильно сконфигурированы? MISO - на вход ?
И если вы юзаете SPL от ST8L- у вас какие то странные функции чтения буфера и передачи .


Последний раз редактировалось dosikus_2 03 ноя 2012, 18:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 03 ноя 2012, 13:11 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
Код:
void SPI_Config (){
  SPI_DeInit();
  SPI_Init (
    SPI_FIRSTBIT_MSB, SPI_BAUDRATEPRESCALER_128, SPI_MODE_MASTER,
    SPI_CLOCKPOLARITY_LOW, SPI_CLOCKPHASE_1EDGE,
    SPI_DATADIRECTION_1LINE_TX, SPI_NSS_SOFT, 0x07);
}

void SPI_SetStatus(void)
{
  SPI_BiDirectionalLineConfig(SPI_DIRECTION_TX); 
  SPI_Cmd(ENABLE);
  PIN_OFF(PIN_SPI_CS);
  SPI_SendData(0x01);
  while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);
  SPI_SendData(0x01);     
  while (SPI_GetFlagStatus(SPI_FLAG_BSY) == SET);
  PIN_ON(PIN_SPI_CS);   
}

unsigned char SPI_ReadStatus(void)
{
  unsigned char data = 0;
  SPI_BiDirectionalLineConfig(SPI_DIRECTION_TX); 
  SPI_Cmd(ENABLE);
  PIN_OFF(PIN_SPI_CS);   
  SPI_SendData(0x05);   
  while (SPI_GetFlagStatus(SPI_FLAG_BSY) == SET);
  delay_us(10); // Без этого будет лишняя передача.
  SPI_BiDirectionalLineConfig(SPI_DIRECTION_RX); 
  while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);
  data = SPI_ReceiveData();
  SPI_Cmd(DISABLE);
  PIN_ON(PIN_SPI_CS);
  return data;
}
Получаем:
Вложение:
screenshot.png
screenshot.png [ 29.06 Кб | Просмотров: 13743 ]

Лапки, естественно все правильно.

Полный перечень SPL, касательно SPI:
Код:
void SPI_DeInit(void);
void SPI_Init(SPI_FirstBit_TypeDef FirstBit,
              SPI_BaudRatePrescaler_TypeDef BaudRatePrescaler,
              SPI_Mode_TypeDef Mode, SPI_ClockPolarity_TypeDef ClockPolarity,
              SPI_ClockPhase_TypeDef ClockPhase,
              SPI_DataDirection_TypeDef Data_Direction,
              SPI_NSS_TypeDef Slave_Management, uint8_t CRCPolynomial);
void SPI_Cmd(FunctionalState NewState);
void SPI_ITConfig(SPI_IT_TypeDef SPI_IT, FunctionalState NewState);
void SPI_SendData(uint8_t Data);
uint8_t SPI_ReceiveData(void);
void SPI_NSSInternalSoftwareCmd(FunctionalState NewState);
void SPI_TransmitCRC(void);
void SPI_CalculateCRCCmd(FunctionalState NewState);
uint8_t SPI_GetCRC(SPI_CRC_TypeDef SPI_CRC);
void SPI_ResetCRC(void);
uint8_t SPI_GetCRCPolynomial(void);
void SPI_BiDirectionalLineConfig(SPI_Direction_TypeDef SPI_Direction);
FlagStatus SPI_GetFlagStatus(SPI_Flag_TypeDef SPI_FLAG);
void SPI_ClearFlag(SPI_Flag_TypeDef SPI_FLAG);
ITStatus SPI_GetITStatus(SPI_IT_TypeDef SPI_IT);
void SPI_ClearITPendingBit(SPI_IT_TypeDef SPI_IT);
Какие есть, с теми и работаем. Другого не дано.

Но вот на возврате функции всегда 0. Думаю...

Update:
Переделал все на Полный дуплекс.
Получается по-красивше и компактней.
Вложение:
screenshot2.png
screenshot2.png [ 31.18 Кб | Просмотров: 13743 ]
Но результат все тот же.

Update №2:
Таки удалось победить!
Путем вычитывания после передачи инструкции "0x05".
И повторного чтения после передачи "0х00" (для поддержки тактирования).
Если любое из них убрать - ничего не получим.
Результат возвращает второе чтение, после передачи 0.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 03 ноя 2012, 14:05 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
Какой чип ? И STM8L и память ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 03 ноя 2012, 15:46 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
dosikus_2 писал(а):
Какой чип ? И STM8L и память ...

Чип - STM8S207K6T6C - 16 МГц
Память - 23K256-I/SN

Сейчас все перевел на предделитель SPI_BAUDRATEPRESCALER_2, для максимальной производительности.
Поубирал почти всю работу через SPL, вывел на прямую. (Скорость возросла на порядок!)
Поплясал с бубном, т.к. очень много тонкостей сразу повылазило. Но главное все отлично и быстренько работает!

Вложение:
screenshot3.png
screenshot3.png [ 33.85 Кб | Просмотров: 13728 ]

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 03 ноя 2012, 18:28 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
DimanVIP писал(а):
Таки удалось победить!
Путем вычитывания после передачи инструкции "0x05".
И повторного чтения после передачи "0х00" (для поддержки тактирования).
Если любое из них убрать - ничего не получим.
Результат возвращает второе чтение, после передачи 0.


Почитайте здесь. viewtopic.php?f=35&t=5237&start=50
Хоть там и на STM32 , но логика работы SPI одна.
ЗЫ SPL зло ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 13:44 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
dosikus_2 писал(а):
Почитайте здесь. viewtopic.php?f=35&t=5237&start=50
Хоть там и на STM32 , но логика работы SPI одна.
ЗЫ SPL зло ...


Спасибо, почитал с удовольствием. Но пользы это мало принесло.
Привожу свое "творение", прошу объективной критики:
Код:
void SPI_SetStatus(void){
  PIN_OFF(PIN_SPI_CS);
  SPI_SendData(0x01);
  while ((SPI->SR & SPI_FLAG_TXE) == RESET);
  SPI_SendData(0x41);   
  while ((SPI->SR & SPI_FLAG_BSY) != RESET);
  PIN_ON(PIN_SPI_CS);   
}
 
unsigned char SPI_ReadStatus(void) {
unsigned char data = 0;
  PIN_OFF(PIN_SPI_CS);   
  SPI_SendData(0x05);   /// Если писать напрямую в регистр, то при чтении мы будем получать 0
  while ((SPI->SR & SPI_FLAG_BSY) != RESET); 
//  while ((SPI->SR & SPI_FLAG_RXNE) == RESET);  // что с проверкой, что без неё - одинаково робит
  data = (uint8_t)(SPI->DR);
  SPI_SendData(0x00);   /// Если писать напрямую в регистр, то при чтении мы будем получать 0
  while ((SPI->SR & SPI_FLAG_BSY) != RESET);
//  while ((SPI->SR & SPI_FLAG_RXNE) == RESET);  // что с проверкой, что без неё - одинаково робит
  PIN_ON(PIN_SPI_CS); 
  data = (uint8_t)(SPI->DR);
  return data; 
}


В таком виде все полностью работает.
Если заменить SPL'шную отправку байта на прямую запись в регистр, то потом при чтении этого регистра, мы всегда будем иметь 0, хотя осцилограммы выглядят одинаково. Загадка однако, видимо SPL даёт какую-то нужную задержку.

А сам SPL я не считаю таким уж большим злом. Я её использую в основном как эдакий справочник.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 14:38 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
Позже посмотрю на STM8S . Пока активно использую только L.
Должно быть что то типа этого:

Код:
PIN_OFF(PIN_SPI_CS);   
  SPI_SendData(0x05);   
  while ((SPI->SR & SPI_FLAG_RXNE) == RESET); 
  data = (uint8_t)(SPI->DR);
  SPI_SendData(0x00);   
while ((SPI->SR & SPI_FLAG_RXNE) == RESET); 
  PIN_ON(PIN_SPI_CS); 
  data = (uint8_t)(SPI->DR);
  return data; 


ЗЫ. SPL как справочники вполне годны. Я то писал о бездумном использовании .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 14:59 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
DimanVIP писал(а):
SPI_SendData(0x05); /// Если писать напрямую в регистр, то при чтении мы будем получать 0
.


Какие вы страсти описываете.
Код в SPL :
Код:
void SPI_SendData(uint8_t Data)
{
    SPI->DR = Data; /* Write in the DR register the data to be sent*/
}


Если тупо заменить SPI_SendData(0x05); на SPI->DR = 0x05; ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 15:19 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
dosikus_2 писал(а):
Если тупо заменить SPI_SendData(0x05); на SPI->DR = 0x05; ?
То на:
data = (uint8_t)(SPI->DR);
будет стабильно иметь 0! Парадокс однако, но факт.

А если сделать так:
Код:
PIN_OFF(PIN_SPI_CS);   
  SPI_SendData(0x05);   
  while ((SPI->SR & SPI_FLAG_RXNE) == RESET); 
  data = (uint8_t)(SPI->DR);
  SPI_SendData(0x00);   
while ((SPI->SR & SPI_FLAG_RXNE) == RESET); 
  PIN_ON(PIN_SPI_CS); 
  data = (uint8_t)(SPI->DR);
  return data;

То на выходе имеем стабильный FF.

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 16:14 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
Здесь так же надо исправлять

Код:
void SPI_SetStatus(void){

  PIN_OFF(PIN_SPI_CS);
  SPI_SendData(0x01);
  while ((SPI->SR & SPI_FLAG_TXE) == RESET);
  SPI_SendData(0x41);   
  while ((SPI->SR & SPI_FLAG_BSY) != RESET);
  PIN_ON(PIN_SPI_CS);   
}

На:
Код:
void SPI_SetStatus(void){
unsigned char data = 0;
  PIN_OFF(PIN_SPI_CS);
  SPI_SendData(0x01);
  while ((SPI->SR & SPI_FLAG_RXNE) == RESET);
  data = (uint8_t)(SPI->DR);
  SPI_SendData(0x41);   
while ((SPI->SR & SPI_FLAG_RXNE) == RESET);
  PIN_ON(PIN_SPI_CS);
   data = (uint8_t)(SPI->DR);
}


В общем смысл такой - каждая транзакция SPI :
Кидаем в буфер данные .
Ждем окончания передачи -что равнозначно окончанию приема , те есть флагу RXNE .
Обязательно считываем буфер , даже если нам не нужны эти данные.

Если при всем этом у вас считывает не то - значится настройки SPI надо копать.
Ибо чудес не бывает...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 16:43 
Заглядывает иногда

Зарегистрирован: 03 окт 2010, 01:49
Сообщения: 176
dosikus_2 писал(а):
Здесь так же надо исправлять

В общем смысл такой - каждая транзакция SPI :
Кидаем в буфер данные .
Ждем окончания передачи -что равнозначно окончанию приема , те есть флагу RXNE .
Обязательно считываем буфер , даже если нам не нужны эти данные.

Если при всем этом у вас считывает не то - значится настройки SPI надо копать.
Ибо чудес не бывает...


С тем же успехом с этим справляется и флаг BSY. Он тоже стоит до самого окончания транзакции.

Но то что вы описали, мне кажется более логичным, т.к. передача у нас полный дуплекс.
И чтобы сбрасывать флаг RXNE, нужно вычитывать регистр.

Переделал в обоих функциях. Все норм.
Теперь можно напрямую писать в регистр для передачи - адекватно работает. (что ей раньше не хватало, загадка).

_________________
Все микрухи работают на волшебном дыме. Стоит только его выпустить - микруха мертва.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 16:56 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4628
DimanVIP писал(а):
С тем же успехом с этим справляется и флаг BSY.


Да нет же.
Изучите более подробно саму структуру SPI . Не только буфер но и сдвиговый регистр и т.д.
Нам нужно в большинстве случаев событие именно окончания передачи .При чем как можно быстрее.
Практически последний такт .
А это подтверждает только RXNE .
И естественно что его надо сбрасывать , что мы и делаем его вычитыванием...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM8L + SPI
СообщениеДобавлено: 04 ноя 2012, 18:23 
Старожил

Зарегистрирован: 08 окт 2012, 00:25
Сообщения: 871
DimanVIP писал(а):
что ей раньше не хватало, загадка

Нет там загадки, есть ваше нежелание читать даташит и разбираться...
Проверять флаг BSY можно только спустя два цикла после загрузки буфера... это есть в даташите...
Когда юзаются лениво-контуженые либы, это условие выполняется автоматом... при прямом обращении - нет...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB