Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2018, 08:40

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • 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
Сообщения: 131
А может надо ждать приема байта по 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 Кб | Просмотров: 14843 ]

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

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


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

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5106
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
Сообщения: 5106
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 Кб | Просмотров: 14792 ]

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

Полный перечень 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 Кб | Просмотров: 14792 ]
Но результат все тот же.

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

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


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

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5106
Какой чип ? И 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 Кб | Просмотров: 14777 ]

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


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

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5106
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
Сообщения: 5106
Позже посмотрю на 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
Сообщения: 5106
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
Сообщения: 5106
Здесь так же надо исправлять

Код:
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
Сообщения: 5106
DimanVIP писал(а):
С тем же успехом с этим справляется и флаг BSY.


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


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

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

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


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

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


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

Сейчас этот форум просматривают: Google [Bot]


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

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

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