реклама на сайте
подробности

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
Ekka
сообщение May 17 2016, 07:41
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Ребята, снова стучу в эту тему((( Недавно обнаружила, что SPI у меня только один раз нормально считывает, а дальше либо какая-то чушь, либо неправильно. Проблема в том, что какой адрес я бы не задавала, например в цикле 10 раз считать по адресу 0х00, возвращается в ответ строка с разными символами, а должны же быть одни и те же. Задаю разные адреса, а приходит одна и та же строка в ответ. Кто-нибудь знает в чем моя проблема...

вот настройка SPI2
Код
void SPI_Master_Config()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

    GPIO_InitTypeDef port;
    port.GPIO_Mode = GPIO_Mode_AF_PP;
    port.GPIO_Pin = SCK|MOSI;
    port.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Port, &port);

    GPIO_InitTypeDef port1;
    port1.GPIO_Mode = GPIO_Mode_Out_PP;
    port1.GPIO_Pin =S;
    port1.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Port, &port1);
    Port->ODR|=S;

    GPIO_InitTypeDef port2;
    port2.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    port2.GPIO_Pin =MISO;
    port2.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Port, &port2);

    SPI_InitTypeDef spi;
    SPI_StructInit(&spi);
    spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    spi.SPI_Mode = SPI_Mode_Master;
    spi.SPI_DataSize = SPI_DataSize_8b;
    spi.SPI_CPOL = SPI_CPOL_High;
    spi.SPI_CPHA = SPI_CPHA_2Edge;
    spi.SPI_NSS = SPI_NSS_Soft;
    spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    spi.SPI_FirstBit = SPI_FirstBit_MSB;
    spi.SPI_CRCPolynomial = 7;
    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE);
    SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_TXE,ENABLE);
    SPI_Init(SPI2, &spi);
    SPI_Cmd(SPI2, ENABLE);
}



Вот опрос микросхемы памяти:
Код
u8 READ(u16 adress)
{
    Port->ODR&=~S;

    SPI_I2S_SendData(SPI2,0b00000011);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    SPI_I2S_SendData(SPI2,adress);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    SPI_I2S_SendData(SPI2,0b00000000);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    err=SPI_I2S_ReceiveData(SPI2);

    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
    SPI_I2S_SendData(SPI2,0b00000000);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    return SPI_I2S_ReceiveData(SPI2);

    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
    Port->ODR|=S;
}


вот сама функция записи в массив из десяти символов (с адреса 0х00...0х09)

Код
void read_string()
{
    for(i=0;i<10;i++)
        mass[i]=READ(i);
}


Пока смотрела, поняла, что после RETURN больше-то ничего не выполняется... ИСПРАВИЛА НА ТАКОЙ КОД.

Код
u8 READ(u16 adress)
{
    Port->ODR&=~S;

    SPI_I2S_SendData(SPI2,0b00000011);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    SPI_I2S_SendData(SPI2,adress);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    SPI_I2S_SendData(SPI2,0b00000000);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    err=SPI_I2S_ReceiveData(SPI2);

    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
    SPI_I2S_SendData(SPI2,0b00000000);
    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);

    mass[i]=SPI_I2S_ReceiveData(SPI2);

    while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) == 1);
        Port->ODR|=S;
}


и функцию считывания строки:
Код
void read_string()
{
    for(i=0;i<10;i++)
        READ(i);
}


теперь с последним приведенным кодом каждый раз с одного и того же адреса считывает одно и тоже.
Есть другие вопросы:
1) Где здесь вообще, по-вашему мнению, ошибки
2) Подключаю плату с др.такой же микросхемой памяти (но питание ниже, чем требуется), может ли из-за этого не считываться ничего с карты памяти?
3) Очень хочу что-нибудь записать в память. Но бьюсь без толку, ничего не пишет в память ни по какому адресу. Не понимаю, что именно не так.
по документации WREN-> WRITE-> WRDI. ПРОСТИТЕ, что так много вопросов. Они насущные)

Сообщение отредактировал Ekka - May 17 2016, 07:42
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 07:45
Сообщение #32


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Вот без обид: datasheet на память надо прочитать хотя бы раз, но НЕ ПО ДИАГОНАЛИ (;

Далее: аргумент у SPI_I2S_SendData какого типа? Почему то байт, то "более длинный" адрес являются аргументом? У вас "spi.SPI_DataSize = SPI_DataSize_8b;" или где?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 07:49
Сообщение #33


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Цитата(Obam @ May 17 2016, 07:45) *
Вот без обид: datasheet на память надо прочитать хотя бы раз, но НЕ ПО ДИАГОНАЛИ (;

Далее: аргумент у SPI_I2S_SendData какого типа? Почему то байт, то "более длинный" адрес являются аргументом? У вас "spi.SPI_DataSize = SPI_DataSize_8b;" или где?


Obam, спасибо, что откликнулись) Начиная со слова "Далее", подробно, немного не понимаю, о чем Вы...
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 07:53
Сообщение #34


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Всё ж пояснил; в свой код гляньте: ф-ия READ и далее аргументы у SPI_I2S_SendData


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 08:00
Сообщение #35


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Так... у меня получается... SPI настроен на 8 бит. Команда имеет тот же формат. А вот адрес... он же как 16 бит передается... так что ли... у меня тогда что.. адрес неверно передается... пожалуйста, помидорами не кидайте( crying.gif

а тип у 2-го аргумента SPI_I2S_SendData() uint16_t...
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 08:01
Сообщение #36


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Адрес в память в два приёма должен выдаваться.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 08:03
Сообщение #37


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



вот же ж... попробуем sad.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 08:11
Сообщение #38


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Вы бы взяли рисуночек со стр.23 datasheet-а и отметили чему каждый вызов соответстсвует, вот, глядишь, просветление и наступит (:


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 08:14
Сообщение #39


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



но ведь принимаю я 1 байт...так? crying.gif

Data out1 и Data out 2 означает что там 2 байта должно вернуться?

Цитата(Ekka @ May 17 2016, 08:13) *
но ведь принимаю я 1 байт...так? crying.gif

Data out1 и Data out 2 означает что там 2 байта должно вернуться?

не. не так.
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 08:23
Сообщение #40


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



На колу мочало - начинаем сказку с начала:
1 (прописью - один) байт команды (0x3) - 1 фиктивный (безсмысленный) вычитанный байт,
2 байта адреса - 2 фиктивных вычитанных байта,
1 фиктивный байт - 1 реальный байт данных вычитанный из памяти. Всё! Разжёвано до байта (; Больше мне сказать нечего.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 08:45
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



УРА)) УРА) УРА) надеюсб, не зря радуюсь хоть.... СПА_СИ_БО, OBAM))) А почему SPI возвращает значения так: на 2 запрос, приходит ответ с первого запроса. Т.е. в массиве у меня значение с адреса 0х01 лежит под номером mass[0], c адреса 0х02 в mass[1]. Как же мне тогда самое первое значение увидеть???

считанная строка совпадает с той, которая програмкой считывает при проверке) записывает наконец-то в память) Но вот как мне самое первое значение получить..? по проверке строка начинается с DOL32... но я вижу только OL32
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 08:58
Сообщение #42


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Вот здесь самое время остановиться и начать штудировать документацию.
Fig.225 на стр.524 в cd00246267.pdf


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 09:12
Сообщение #43


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



такой нюанс
"На колу мочало - начинаем сказку с начала:
1 (прописью - один) байт команды (0x3) - 1 фиктивный (безсмысленный) вычитанный байт,
2 байта адреса - 2 фиктивных вычитанных байта,
1 фиктивный байт - 1 реальный байт данных вычитанный из памяти. Всё! Разжёвано до байта (; Больше мне сказать нечего."

в такой случае во всех mass[i] просто байт по адресу 0х05. А если не принимаю фиктивных байтов от команды и адреса - все работает.

Obam, спасибо за терпение) rolleyes.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение May 17 2016, 09:27
Сообщение #44


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Фиктивные (ладно - пусть не фиктивные. Безсмысленные! Так больше нравится?) всё равно надо забирать из DR.
Я просто процитирую сам себя http://electronix.ru/forum/index.php?showt...t&p=1419227 "SPI - интерфейс синхронный и двунаправленный: синхроимпульсы мастера тактируют и данные от мастера в ведомого и одновременно данные из ведомого. На каждый переданный байт ведомому мастер получает байт от ведомого." Вот это и подразумевалось про "кол и мочало".


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ekka
сообщение May 17 2016, 09:51
Сообщение #45


Частый гость
**

Группа: Участник
Сообщений: 164
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Спасибо всем, кто помогал и тратил свои нервы и знания) Все получилось) Obam, премного благодарю) biggrin.gif

Вы были правы, Obam, единственное только, что для того, чтобы получить реальный байт потом, фиктивный не надо перед этим забирать. Просто пустую команду и забираю байт. Теперь вижу всю строку DOL32 cal

ну через некоторое время увидим) может я опять накосячила...)))

Сообщение отредактировал Ekka - May 17 2016, 09:47
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 05:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.0155 секунд с 7
ELECTRONIX ©2004-2016