Перейти к содержанию
    

По поводу SPI -

1. У меня не получилось нормально настроить SS на выход. Вернее на выход он настраивается, но стоит только разрешить SPI (SPIEN бит) как SS встает в 0 и никак не привязан к фреймам.

2. Хоть и написано что CPHA можно менять не отключая SPI (если в данный момент нет передачи) это как то криво работает (с флагом что данные есть были глюки прходилось проверять перед отправкой и первый байт отправлялся криво), заморачиваться не стал - переключаю SPI двумя записями - 1 с новым конфигом но без enable, вторая с enabe.

 

По поводу отладки

Отладка через FT2232 работает, но есть некоторая кривость IMHO связана с серьезными отличаями архитектуры ( новые регистры) IAR при отладке через GDB server показывает только R0 - R12 и PC

LR SP все время 0, остальные регистры вообще ----.

Сечас в основонм отлаживаюсь в RAM ( init script ресетит проц, устанавливает VTOR и PC) все работает даже прерывания и в RAM и во фелеше. Только после загрузки программы в RAM надо сделать single step (можно в асме прямо) а потом run иначе встанет где нибудь сама, в произвольном месте, что за фича не понятно ( но не критично single step вылечивает).

 

Тут сделал свой отладчик для SWD на FT245R/FT232R используя synchro bit bang. c протоколом SWD полностью разобрался. И даже прикрутил эту штуку к OpenOCD и вот сегодня даже удалось пошагать под IAR. Но пока все кривовато (особенно внедрение в openocd я переписал cortex_swjdp так что фиксировано работает с моим устройством через swd_dp).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу отладки

Отладка через FT2232 работает, но есть некоторая кривость IMHO связана с серьезными отличаями архитектуры ( новые регистры) IAR при отладке через GDB server показывает только R0 - R12 и PC

LR SP все время 0, остальные регистры вообще ----.

Сечас в основонм отлаживаюсь в RAM ( init script ресетит проц, устанавливает VTOR и PC) все работает даже прерывания и в RAM и во фелеше. Только после загрузки программы в RAM надо сделать single step (можно в асме прямо) а потом run иначе встанет где нибудь сама, в произвольном месте, что за фича не понятно ( но не критично single step вылечивает).

 

Тут сделал свой отладчик для SWD на FT245R/FT232R используя synchro bit bang. c протоколом SWD полностью разобрался. И даже прикрутил эту штуку к OpenOCD и вот сегодня даже удалось пошагать под IAR. Но пока все кривовато (особенно внедрение в openocd я переписал cortex_swjdp так что фиксировано работает с моим устройством через swd_dp).

а почему вы взяли делать отладчик свд из 245й в битбэнг моде а не из той же 2232 ? если не секрет конечно ? ведь та более предназначена для этого насколько я понимаю. второй вопрос а не будет ли вам сложн оподелиться ссылками на документы , которые помогли вам в реализации своего swd ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а почему вы взяли делать отладчик свд из 245й в битбэнг моде а не из той же 2232 ? если не секрет конечно ? ведь та более предназначена для этого насколько я понимаю. второй вопрос а не будет ли вам сложн оподелиться ссылками на документы , которые помогли вам в реализации своего swd ?

232R/245R не требует внешних компонентов (генератор и eeprom на борту), еще дешевле и меньше по размеру. Лучше использовать 232R т.к. может работать еще и в режиме UART ( можно например LPC программировать). К тому же по скорости не намного медленнее 2232 получается потому что основные задержки происходят в USB (полудуплекс). К тому же у меня есть плата на которй используется 245R ( поэтому пока с ней и работаю, старые 232 не катят там нет синхро бит банг).

 

а основные документы

IHI0031A_ARM_debug_interface_v5.pdf

DDI0337E_cortex_m3_r1p1_trm.pdf

DDI0405B_arm_v7m_architecture_app_level_reference_manual.pdf

 

они доступны на сайте arm ( для некоторых надо зарегистрироваться и сразу можно скачать)

 

 

кстати OpenOcd прекрасно работает с флешом stm32, сейчас проверил. Там только артефакт в исходнике надо убрать ( наверное от str остался)

а то пишет что флеш с 0x08000000 начинается.

Index: stm32x.c
===================================================================
--- stm32x.c    (revision 526)
+++ stm32x.c    (working copy)
@@ -676,7 +676,7 @@
    
    LOG_INFO( "flash size = %dkbytes", num_sectors );
    
-    bank->base = 0x08000000;
+    bank->base = 0x00000000;
    bank->size = num_sectors * 1024;
    bank->num_sectors = num_sectors;
    bank->sectors = malloc(sizeof(flash_sector_t) * num_sectors);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал в своей программе переводить stm32 в режим сна командами WFI и WFE. Работает вроде как ожидалось, но есть неприятный сюрприз: перестает работать jtag. Использую J-Link вместе с IAR. Так вот IAR пишет

Fri Apr 04 10:12:27 2008: Fatal error: Wrong ROM table component Id. Expected 0xB105100D, Found 0x00000000

Проверил это на двух кристалах. Причем во второй раз в программе сделал возможность выключать засыпание. Теперь при включенном засыпании jtag не работает, выключаю засыпание - работает снова.

Не помню ничего на этот счет в документации, или я что-то пропустил? Покопался немного в гугле, нашел упоминание о таком поведении http://www.st.com/mcu/forums-cat-6541-23.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробовал в своей программе переводить stm32 в режим сна командами WFI и WFE. Работает вроде как ожидалось, но есть неприятный сюрприз: перестает работать jtag. Использую J-Link вместе с IAR.

 

да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип :) и теперь jtag-ом до них не дотянуться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

cebotor

[q]да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип и теперь jtag-ом до них не дотянуться.[/q]

Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?

 

cebotor

да это общая беда многих кристаллов. у меня есть экземпляры и stm32 и lpc2368 , в которых ради измерения потребления тока , было первыми командами сделан слип и теперь jtag-ом до них не дотянуться.

Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?

 

 

cebotor

Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?

 

 

Это мой первый опыт общения с армами, поэтому для меня это новость. Я его воткнул в idle hook FreeRTOS. Получается нужно просто сделать задержку разрешения засыпания после сброса?

 

 

 

Нет макета под руками, проверить не могу.

Сейчас ведь, что у меня получается: сразу после сброса опция, разрешающая засыпание, разрешена и jtag не работает. Устанавливаю в программе запрет засыпания и jtag начинает работать. Получается jtag не сбрасывает контроллер? Иначе после сброса опция, разрешающая засыпание, включилась бы и не дала работать jtag. А jtag все же работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас ведь, что у меня получается: сразу после сброса опция, разрешающая засыпание, разрешена и jtag не работает. Устанавливаю в программе запрет засыпания и jtag начинает работать. Получается jtag не сбрасывает контроллер? Иначе после сброса опция, разрешающая засыпание, включилась бы и не дала работать jtag. А jtag все же работает.

Логика крайне проста - жтаг не может дотянуться до контроллера пока тот спит(вообще), если у вас в проекте пауза между периодами сна больше времени требующегося жтагу чтобы остановить процессор, то проблем быть не должно (теоретически).. На практике же, например lpc очень медленно останавливается по жтагу - сначала стопается ядро , а потом вся переферия - так что глобально программа может таки встать раком.

 

Да и еще если пауза достаточна , но периоды сна слишком велики - то у жтага будет выходить таймаут и у вас процессор будет подчиняться ему (жтагу) через раз :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

День добрый.,

У меня проблема с модулем I2C на STM32F103.

Встечал в теме фразу, корявий мол I2C.

Помогите розобратся.

Проблема в следующем:

на I2C подключена EEPROM 24LC256, всял из екземпелов пример по роботе с I2C EEPROM, единственое что подменил, сделал два байти установки адреса ячейки в EEPROM (в примере однобайтная адресация).

проблема с том, что после одного чтения из EEPROM код зависает, не может создать старт (зацикливается на ужедании создания старта),

потогает ресет кода.

часть кода

EEPROM_ADDRESS = 0xA2;

u16 ee_adr=0;

while(1)

{

u8 qwq;

I2C_EE_BufferRead(&qwq, ee_adr++, 1);

uartSendByte(GSM_UART,qwq);

}

тоесть в цыкле читаю EEPROM,

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

I2C_EE_BufferRead(&qwq, ee_adr++, 1);

или

uartSendByte(GSM_UART,qwq);

то все работает (читается байт за байтом)

работаю через MT-Link+JTAG+IAR

пробовал в чикл вставлять паузу(после завершения чтения EEPROM), не помогает

Посоветуйте, куда копать :help:

Заранее благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[q]cebotor[/q]

Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд.

Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за разъяснения. Картинка получается не совсем приятная, пытаться искусственно управлять периодами сна и бодрствования как-то уж совсем печально, на мой взгляд.

Придется все же делать возможность выключить засыпание в работающей программе, чтобы иметь возможность дать работать jtag.

С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах!

Изменено пользователем KRS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении .

Привожу исходник

/*******************************************************************************

* Function Name : I2C_EE_BufferRead

* Description : Reads a block of data from the EEPROM.

* Input : - pBuffer : pointer to the buffer that receives the data read

* from the EEPROM.

* - ReadAddr : EEPROM's internal address to read from.

* - NumByteToRead : number of bytes to read from the EEPROM.

* Output : None

* Return : None

*******************************************************************************/

void I2C_EE_BufferRead(u8* pBuffer, u16 ReadAddr, u16 NumByteToRead)

{

/* Send START condition */

I2C_GenerateSTART(I2C1, ENABLE);

 

/* Test on EV5 and clear it */вот тут циклится!!!

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

 

/* In the case of a single data transfer disable ACK before reading the data */

if(NumByteToRead==1)

{

I2C_AcknowledgeConfig(I2C1, DISABLE);

}

 

/* Send EEPROM address for write */

I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);

 

/* Test on EV6 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

 

/* Clear EV6 by setting again the PE bit */

I2C_Cmd(I2C1, ENABLE);

 

/* Send the EEPROM's internal address (high byte)to write to */

I2C_SendData(I2C1, ReadAddr>>8);

 

/* Test on EV8 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

 

/* Send the EEPROM's internal address (low byte) to write to */

I2C_SendData(I2C1, ReadAddr);

 

/* Test on EV8 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

 

/* Send STRAT condition a second time */

I2C_GenerateSTART(I2C1, ENABLE);

 

/* Test on EV5 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

 

/* Send EEPROM address for read */

I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Receiver);

 

/* Test on EV6 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

 

/* While there is data to be read */

while(NumByteToRead)

{

/* Test on EV7 and clear it */

if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))

{

 

if(NumByteToRead == 2)

{

/* Disable Acknowledgement */

I2C_AcknowledgeConfig(I2C1, DISABLE);

 

}

 

if(NumByteToRead == 1)

{

/* Send STOP Condition */

I2C_GenerateSTOP(I2C1, ENABLE);

}

 

/* Read a byte from the EEPROM */

*pBuffer = I2C_ReceiveData(I2C1);

 

/* Point to the next location where the byte read will be saved */

pBuffer++;

 

/* Decrement the read bytes counter */

NumByteToRead--;

 

}

}

 

/* Enable Acknowledgement to be ready for another reception */

I2C_AcknowledgeConfig(I2C1, ENABLE);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

KRS

С stm32 по поводу этого можно не беспокоится! Потому что законектится к процу через SWD можно пока он в ресете ( сам лично пробовал ). И можно легко не дать процу выполнить не одной команды ( достаточно поставить остновку на ресет и потом только отпустить ногу ресет) как все это делается описано в соотв. даташитах!

Спасибо, буду знать. Только у меня сейчас старенький J-Link, а он, насколько я знаю, SWD не поддерживает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проверил процедуру записи байта в еепромку - работает нормально, похоже имено в чтении .

Кривость реализации i2c в stm, заключается в том, что они там наворотили "не совсем стэйт машину".. То есть евенты евентами , но отрабатывать их надо побитно а не так как они рекомендуют.

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

 

И простите поллингом я ничего не делал только по прерыванию.

 

Я для начала делал так

добавил к строке

#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((u32)0x00070084)

#define I2C_EVENT_MASTER_BYTE_TRANSMITTED_2 ((u32)0x00000084)

#define I2C_EVENT_MASTER_BYTE_REQUESTED ((u32)0x00070080)

все три события - обрабатываютьяс эквивалентно ...

 

И это касается нескольких событий... Однако потом мне стало стыдно и я переписал все на побитную обработку и "фирменные" события не использую совсем ...

Просить меня дать получившееся не имеет смысла ибо "агрегаты" , которыми я управляю сами имеют шандарахнутый I2C .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо что откликнулись.

Пошаговая отладка показала что переменая (см. ниже) LastEvent получает значение 0х00030041, вместо 0х00030001. похоже гдето ещо появляется событие RxNE: Data Register not Empty (receivers).

но откуда, и почему при шаговом выполнении все работает? не пойму. Переделал подтяжку согласно доки (добавил по резистору между шиной и контроллером), ничего не поменялось.

подскажите, как побороть эту беду :crying:

 

/*******************************************************************************

* Function Name : I2C_CheckEvent

* Description : Checks whether the last I2Cx Event is equal to the one passed

* as parameter.

* Input : - I2Cx: where x can be 1 or 2 to select the I2C peripheral.

* - I2C_EVENT: specifies the event to be checked.

* This parameter can be one of the following values:

* - I2C_EVENT_SLAVE_ADDRESS_MATCHED : EV1

* - I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2

* - I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3

* - I2C_EVENT_SLAVE_ACK_FAILURE : EV3-1

* - I2C_EVENT_MASTER_MODE_SELECT : EV5

* - I2C_EVENT_MASTER_MODE_SELECTED : EV6

* - I2C_EVENT_MASTER_BYTE_RECEIVED : EV7

* - I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8

* - I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9

* - I2C_EVENT_SLAVE_STOP_DETECTED : EV4

* Output : None

* Return : An ErrorStatus enumuration value:

* - SUCCESS: Last event is equal to the I2C_Event

* - ERROR: Last event is different from the I2C_Event

*******************************************************************************/

ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT)

{

u32 LastEvent = 0;

u32 Flag1 = 0, Flag2 = 0;

ErrorStatus status = ERROR;

 

/* Check the parameters */

assert_param(IS_I2C_EVENT(I2C_EVENT));

 

Flag1 = I2Cx->SR1;!!!!!!!!!!!иногда стает 0х00000041, хотя SR1=0х00000001!!!!!!!!!!!!!!!!!!

Flag2 = I2Cx->SR2;

Flag2 = Flag2 << 16;

 

/* Get the last event value from I2C status register */

LastEvent = (Flag1 | Flag2) & I2C_FLAG_Mask;

 

/* Check whether the last event is equal to I2C_EVENT */

if (LastEvent == I2C_EVENT )

{

/* SUCCESS: last event is equal to I2C_EVENT */

status = SUCCESS;

}

else

{

/* ERROR: last event is different from I2C_EVENT */

status = ERROR;

}

 

/* Return status */

return status;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...