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

 
 
> Память M95-256, stm32f100+M95-256
Ekka
сообщение Apr 12 2016, 12:23
Сообщение #1


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

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



Ребята, доброго времени суток) Бьюсь над памятью М95-256. Пишу на Си. МК -stm32f100. Хочу просто считать статусный регистр. Документация мною более-менее изучена. Не могу понять, где ошибка. Почему возвращает 255... иногда 7 возвращается. Может кто-то работал с этой зверь-машиной? Может неверный алгоритм, код, какой-то вообще левый косяк? Я в начинающих пока что. Соображаю медленно.

#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_spi.h>
#include <misc.h>

#define S GPIO_Pin_4
#define Port GPIOA
#define D GPIO_Pin_7
#define Q GPIO_Pin_6
#define C GPIO_Pin_5
#define W GPIO_Pin_2
#define HOLD GPIO_Pin_3

void RDSR()
{
Port->ODR|=W;
Port->ODR&=~S;
SPI_I2S_SendData(SPI1,0b00000101);
Port->ODR|=S;
}

int main(void)
{
SPI_Master_Conf();
RDSR();
while(1);
}


void SPI_Master_Conf()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

GPIO_InitTypeDef port;
port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = C|Q|D;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Port, &port);


GPIO_InitTypeDef port1;
port1.GPIO_Mode = GPIO_Mode_Out_PP;
port1.GPIO_Pin = W|S|HOLD;
port1.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(Port, &port1);

Port->ODR|=S;
Port->ODR&=~(HOLD|W);

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_Low;
spi.SPI_CPHA = SPI_CPHA_2Edge;
spi.SPI_NSS = SPI_NSS_Soft;
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
spi.SPI_FirstBit = SPI_FirstBit_MSB;
spi.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &spi);
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_RXNE);
NVIC_EnableIRQ(SPI1_IRQn);
SPI_Cmd(SPI1, ENABLE);
}

u32 answer=0;
void SPI1_IRQHandler()
{
if(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==1)
{
SPI_I2S_ClearITPendingBit(SPI1,SPI_I2S_IT_RXNE);
answer=(u32)SPI_I2S_ReceiveData(SPI1);
}

}


Сообщение отредактировал Ekka - Apr 12 2016, 12:25
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Apr 12 2016, 15:15
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Не вижу включения тактирования AFIO. Это тактирование альтернативных функций. Нужно почти всегда.
Добавьте в начало что-то вроде
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Ekka
сообщение Apr 13 2016, 06:25
Сообщение #3


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

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



Цитата(AHTOXA @ Apr 12 2016, 16:15) *
Не вижу включения тактирования AFIO. Это тактирование альтернативных функций. Нужно почти всегда.
Добавьте в начало что-то вроде
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);



Добавила. Но что-то не помогло. Где-то в другом косяк...
Go to the top of the page
 
+Quote Post
Ekka
сообщение Apr 13 2016, 08:08
Сообщение #4


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

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



Могут ли быть мною опущены какие-то временные задержки? Возвращает то 5, то 255....
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 13 2016, 09:15
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вы вообще неправильно работаете с SPI.
SPI_I2S_SendData(); - просто записывает байт в регистр передатчика. После надо опрашивать статус, чтобы узнать, когда данные отправятся.
(Удобно ждать, когда взведётся бит RXNE).
Перед снятием CS надо подождать ещё немножко, потому что флаг RXNE может взводиться немного раньше, чем завершается передача байта.
Ногу MISO я конфигурирую не как PUSH-PULL, а как INPUT.
Прерывание пока уберите, сделайте просто опросом:

Код
unsigned char SpiRw(unsigned char out)
{
    SPI_I2S_SendData(SPI1,out);
    while (!(SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE));
    return SPI_I2S_ReceiveData(SPI1);;
}

void smallDelay()
{
    volatile int i;
    for (i = 0; i < 100; ++i) {}
}

unsigned char RDSR()
{
    unsigned char ret;
    Port->ODR|=W;
    Port->ODR&=~S;
    ret = SpiRw(0b00000101);
    smallDelay();
    Port->ODR|=S;
    return ret;
}



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Ekka
сообщение Apr 13 2016, 11:28
Сообщение #6


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

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



Хм... ща попробуем

Спасибо Вам за ответы)))

Вот думаю... может я неправильно подключила.... У меня память М95-256. Есть у нее вход-Q, выход - D, выбор чипа S, С- тактирование. согласно с принципами SPI, MOSI соединяю c Q, MISO - c D, CS - S, NSS - C... HOLD и W - настраиваю как выходы, кидаю на свободные пины.

Хм.... почему же на MISO мк висит единица, просто единица... 255 гонит и все тут. Хотя команда проходит
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 08:40
Сообщение #7


Знающий
****

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



Цитата(Ekka @ Apr 13 2016, 15:28) *
Хм... ща попробуем

Спасибо Вам за ответы)))

Вот думаю... может я неправильно подключила.... У меня память М95-256. Есть у нее вход-Q, выход - D, выбор чипа S, С- тактирование. согласно с принципами SPI, MOSI соединяю c Q, MISO - c D, CS - S, NSS - C... HOLD и W - настраиваю как выходы, кидаю на свободные пины.

Хм.... почему же на MISO мк висит единица, просто единица... 255 гонит и все тут. Хотя команда проходит


Разрешите встрять? Спасибо (:

Так вот: смотрим в datasheet и видим
D - Serial Data Input - Input
Q - Serial Data Output - Output

Попутали, Ekka, вход и выход у памяти - этим и объясняется дикое поведение. Даже чисто мнемонически, на картинке (как по ГОСТу) входы - слева, выход - справа.
В контроллере MISO - настраивать как ВХОД; MOSI - настраивать как PUSH-PULL.


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


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

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



Цитата(Obam @ Apr 14 2016, 09:40) *
Разрешите встрять? Спасибо (:

Так вот: смотрим в datasheet и видим
D - Serial Data Input - Input
Q - Serial Data Output - Output

Попутали, Ekka, вход и выход у памяти - этим и объясняется дикое поведение. Даже чисто мнемонически, на картинке (как по ГОСТу) входы - слева, выход - справа.
В контроллере MISO - настраивать как ВХОД; MOSI - настраивать как PUSH-PULL.


Код
#include <stm32f10x.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_spi.h>
#include <misc.h>

#define Port GPIOA        //Основной порт
#define S GPIO_Pin_4    //Выбор чипа
#define MISO GPIO_Pin_6    //Вход(куда приходят данные)
#define MOSI GPIO_Pin_7    //Выход(откуда уходят данные)
#define SCK GPIO_Pin_5    //Сигналы синхронизации (таймер тактирования)
#define W GPIO_Pin_2    //Защита от записи
#define HOLD GPIO_Pin_3    //Удержание устройства (останов без сброса)

void SPI_Master_Conf();
void RDSR();
void delay(int ms)
{
    int a=0;
    for(a=0;a<ms;a++);
}

int main(void)
{
    SPI_Master_Conf();

    while(1){
        RDSR();

    }
}

u16 answer=0;
void RDSR()
{
    Port->ODR&=~S;
    SPI_I2S_SendData(SPI1,0b00000101);
    SPI_I2S_SendData(SPI1,0b00000000);
    SPI_I2S_SendData(SPI1,0b00000000);
   // while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0));
    answer=SPI_I2S_ReceiveData(SPI1);
    Port->ODR|=S;
}

void SPI_Master_Conf()
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, 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|W|HOLD;
    port1.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(Port, &port1);

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

    Port->ODR|=(S|HOLD|W);

    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_Low;
    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_Init(SPI1, &spi);
    SPI_Cmd(SPI1, ENABLE);
}




так что ли?

Но память один фиг не отвечает. Ну что ж я не так делаю... на осциллографе даже нет признаков жизни. На входе МК же должен быть ответ памяти, да? Там тупо 0. Тогда почему в answer 255... чет я запуталась вкорень


Может, она того.... сгорела sad.gif

Может, я неправильно W и HOLD настроила? Они же должны быть в единицах? Если HOLD опущу - будет пауза. Если W опущу, установлю защиту от записи. Или я опять что-то путаю.


Может, кто делал такую штуку и есть хоть похожий пример?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ekka   Память M95-256   Apr 12 2016, 12:23
|- - AHTOXA   Цитата(Ekka @ Apr 13 2016, 16:28) Хм.... ...   Apr 13 2016, 12:03
||- - Ekka   А так можно написать? #include <stm32f10x.h...   Apr 13 2016, 12:06
||- - AHTOXA   Цитата(Ekka @ Apr 13 2016, 17:06) unsigne...   Apr 13 2016, 12:25
||- - Ekka   если я убираю это. Цикл WHILE , который ждет, пока...   Apr 13 2016, 12:46
||- - AHTOXA   Цитата(Ekka @ Apr 13 2016, 17:46) если я ...   Apr 13 2016, 13:25
||- - Ekka   Спасибо за Ваши ответы))) Микросхема начала отвеча...   Apr 14 2016, 08:07
- - Obam   Кодом в меня тыкать не надо (: Смысл моего замеча...   Apr 14 2016, 09:28
|- - Ekka   Цитата(Obam @ Apr 14 2016, 10:28) Кодом в...   Apr 14 2016, 09:38
- - Obam   Хорошо, едем дальше… В п/п вам надо 2 раза знать ...   Apr 14 2016, 10:02
|- - Ekka   Спасибо за разъяснение, Obam, т.е. функция должна ...   Apr 14 2016, 10:16
|- - Obam   Цитата(Ekka @ Apr 14 2016, 14:16) Спасибо...   Apr 14 2016, 11:01
|- - Ekka   Да. Но с пониманием туго(   Apr 14 2016, 11:14
|- - Obam   Цитата(Ekka @ Apr 14 2016, 15:14) Да. Но ...   Apr 14 2016, 11:57
|- - Ekka   Цитата(Obam @ Apr 14 2016, 12:57) Так при...   Apr 14 2016, 12:42
|- - Obam   Цитата(Ekka @ Apr 14 2016, 16:42) Только ...   Apr 14 2016, 12:49
|- - Ekka   Нет... что-то не так. Микросхема не отвечает. Хотя...   Apr 14 2016, 13:05
|- - Obam   Цитата(Ekka @ Apr 14 2016, 17:05) Нет... ...   Apr 14 2016, 13:12
|- - Ekka   Такая штука... как только я использую ожидание фла...   Apr 14 2016, 13:16
- - Obam   Не нервничайте, спокойно читайте datasheet и RefMa...   Apr 14 2016, 13:35
|- - Ekka   Код#include <stm32f10x.h> #include <st...   Apr 15 2016, 07:24
|- - Ekka   возник др.вопрос. Чтобы считать что-нибудь из памя...   Apr 15 2016, 11:51
|- - Ekka   Вроде разобралась как принять байт из памяти. Нача...   Apr 15 2016, 13:18
|- - Ekka   Ребята, снова стучу в эту тему((( Недавно обнаружи...   May 17 2016, 07:41
- - Obam   Вот без обид: datasheet на память надо прочитать х...   May 17 2016, 07:45
|- - Ekka   Цитата(Obam @ May 17 2016, 07:45) Вот без...   May 17 2016, 07:49
- - Obam   Всё ж пояснил; в свой код гляньте: ф-ия READ и дал...   May 17 2016, 07:53
|- - Ekka   Так... у меня получается... SPI настроен на 8 бит....   May 17 2016, 08:00
- - Obam   Адрес в память в два приёма должен выдаваться.   May 17 2016, 08:01
|- - Ekka   вот же ж... попробуем   May 17 2016, 08:03
|- - Ekka   но ведь принимаю я 1 байт...так? Data out1 и Dat...   May 17 2016, 08:14
|- - Ekka   УРА)) УРА) УРА) надеюсб, не зря радуюсь хоть.... С...   May 17 2016, 08:45
|- - Ekka   Спасибо всем, кто помогал и тратил свои нервы и зн...   May 17 2016, 09:51
|- - Obam   Цитата(Ekka @ May 17 2016, 13:51) Все пол...   May 17 2016, 09:55
- - Obam   Вы бы взяли рисуночек со стр.23 datasheet-а и отме...   May 17 2016, 08:11
- - Obam   На колу мочало - начинаем сказку с начала: 1 (проп...   May 17 2016, 08:23
- - Obam   Вот здесь самое время остановиться и начать штудир...   May 17 2016, 08:58
|- - Ekka   такой нюанс "На колу мочало - начинаем сказк...   May 17 2016, 09:12
- - Obam   Фиктивные (ладно - пусть не фиктивные. Безсмысленн...   May 17 2016, 09:27


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

 


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


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