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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> Память M95-256, stm32f100+M95-256
Ekka
сообщение Apr 14 2016, 09:38
Сообщение #16


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

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



Цитата(Obam @ Apr 14 2016, 10:28) *
Кодом в меня тыкать не надо (:

Смысл моего замечания таков: физически MOSI разведён на Q? физически MISO разведён на D? Если так, то хоть обпереопределяйся - лажа не исправится.


Нет... у меня физически MISO разведен на Q, а MOSI - на D.

подключено вроде все правильно...уже несколько раз перепроверено(
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 10:02
Сообщение #17


Знающий
****

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



Хорошо, едем дальше…

В п/п вам надо 2 раза знать статус памяти?
"void RDSR()
{
Port->ODR&=~S;
SPI_I2S_SendData(SPI1,0b00000101);

// где ожидание окончания передачи/приёма и вычитка DR? При этом здесь не будет действительных данных от памяти.

SPI_I2S_SendData(SPI1,0b00000000);
// где ожидание окончания передачи/приёма и вычитка DR? А здесь данные будут.

SPI_I2S_SendData(SPI1,0b00000000);
// где ожидание окончания передачи/приёма и вычитка DR? И здесь будут.
// while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0));
answer=SPI_I2S_ReceiveData(SPI1);
Port->ODR|=S;
}
"
SPI - интерфейс синхронный и двунаправленный: синхроимпульсы мастера тактируют и данные от мастера в ведомого и одновременно данные из ведомого. На каждый переданный байт ведомому мастер получает байт от ведомого.





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


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

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



Спасибо за разъяснение, Obam, т.е. функция должна быть такой???

Код
Port->ODR&=~S; //выбираем чип
    SPI_I2S_SendData(SPI1,0b00000101); //команда СЧИТАТЬ РЕГИСТР
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE)==0));//ждем, пока данные отправятся
    SPI_I2S_SendData(SPI1,0b00000000); //отправляем пустую команду, чтобы считать байт
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE)==0)); //ждем, пока отправится
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0)); //ждем, когда можно будет считать
    answer=SPI_I2S_ReceiveData(SPI1);//считываем байт
    Port->ODR|=S; //сброс чипа


что-то тут не так... ждем много. И там ли я поставила ожидание.

А если просто не сбрасывать чип и сделать так?
Код
Port->ODR&=~S; //выбираем чип
    SPI_I2S_SendData(SPI1,0b00000101); //команда СЧИТАТЬ РЕГИСТР
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE)==0));//ждем, пока данные отправятся
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0)); //ждем, когда можно будет считать
    answer=SPI_I2S_ReceiveData(SPI1);//считываем байт
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 11:01
Сообщение #19


Знающий
****

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



Цитата(Ekka @ Apr 14 2016, 14:16) *
Спасибо за разъяснение, Obam, т.е. функция должна быть такой???

Код
Port->ODR&=~S; //выбираем чип
    SPI_I2S_SendData(SPI1,0b00000101); //команда СЧИТАТЬ РЕГИСТР
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE)==0));//ждем, пока данные отправятся
    SPI_I2S_SendData(SPI1,0b00000000); //отправляем пустую команду, чтобы считать байт
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_TXE)==0)); //ждем, пока отправится
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0)); //ждем, когда можно будет считать
    answer=SPI_I2S_ReceiveData(SPI1);//считываем байт
    Port->ODR|=S; //сброс чипа


что-то тут не так... ждем много. И там ли я поставила ожидание.


Ну ё-моё ): разъяснение не подействовало?

Код
Port->ODR&=~S; //выбираем чип
    SPI_I2S_SendData(SPI1,0b00000101); //команда СЧИТАТЬ РЕГИСТР
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0));//ждем, пока данные отправятся и можно будет считать
    answer=SPI_I2S_ReceiveData(SPI1);//считываем байт - здесь фиктивный

    SPI_I2S_SendData(SPI1,0b00000000); //отправляем пустую команду, чтобы считать байт
    while((SPI_I2S_GetITStatus(SPI1,SPI_I2S_IT_RXNE)==0)); //ждем, пока отправится и можно будет считать
        answer=SPI_I2S_ReceiveData(SPI1);//считываем байт
    Port->ODR|=S; //сброс чипа


Вы картиночку Fig.225 на стр.524 в cd00246267.pdf видели?


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


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

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



Да. Но с пониманием туго( smile3046.gif
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 11:57
Сообщение #21


Знающий
****

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



Цитата(Ekka @ Apr 14 2016, 15:14) *
Да. Но с пониманием туго( smile3046.gif


Так приложите к ней рисунок со стр. 19 из CD00103810.pdf: SCK это C, MOSI это D, MISO это Q.

Байт положили в DR, он автоматом переносится в сдвиговый регистр и начинает побитно отправляться ведомому;
при этом ведомый побитно отдаёт свой байт ведущему. Все биты переданы (а соответственно и приняты) - тогда
выставляется флаг RXNE => можно считать полученное.


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


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

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



Цитата(Obam @ Apr 14 2016, 12:57) *
Так приложите к ней рисунок со стр. 19 из CD00103810.pdf: SCK это C, MOSI это D, MISO это Q.

Байт положили в DR, он автоматом переносится в сдвиговый регистр и начинает побитно отправляться ведомому;
при этом ведомый побитно отдаёт свой байт ведущему. Все биты переданы (а соответственно и приняты) - тогда
выставляется флаг RXNE => можно считать полученное.



Только чур камнями не бросать)
Тогда выходит
сначала я кладу в DR регистр мою команду,
потом жду пока TXE флаг установится,
потом передаю пустой байт,
потом жду пока RXNE флаг установится,
и забираю ответный байт?
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 12:49
Сообщение #23


Знающий
****

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



Цитата(Ekka @ Apr 14 2016, 16:42) *
Только чур камнями не бросать)
Тогда выходит
сначала я кладу в DR регистр мою команду,
потом жду пока TXE флаг установится,
потом передаю пустой байт,
потом жду пока RXNE флаг установится,
и забираю ответный байт?


Не надо TXE сейчас использовать.

Ваши действия таковы:
"сначала я кладу в DR регистр мою команду,
потом жду пока RXNE флаг установится,
забираю фиктивный ответный байт
потом передаю пустой байт,
потом жду пока RXNE флаг установится,
и забираю ответный байт?
"

В посте #19 уже и код был приведён.


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


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

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



Нет... что-то не так. Микросхема не отвечает. Хотя байты передаются. Микросхему проверили, протестили, рабочая, с др.устройством все прекрасно отвечает... хмм

Почему TXE сейчас не используем?
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 13:12
Сообщение #25


Знающий
****

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



Цитата(Ekka @ Apr 14 2016, 17:05) *
Нет... что-то не так. Микросхема не отвечает. Хотя байты передаются. Микросхему проверили, протестили, рабочая, с др.устройством все прекрасно отвечает... хмм


С каким "др.устройством все прекрасно отвечает"? Телепаты в отпуске (;

Цитата
Почему TXE сейчас не используем?


ТXE - это флаг пустого DR, но не пустого сдвигового регистра; используется для того чтобы повысить пропускную способность SPI. На рис. 225 всё "до тла" разжёвано.


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


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

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



Такая штука... как только я использую ожидание флага RXNE, просто добавляю эти строки... на входе схемы памяти перестает отображаться та команда, которую она получает от МК и просто висит единица... почему так??? (((
что за магия..
Go to the top of the page
 
+Quote Post
Obam
сообщение Apr 14 2016, 13:35
Сообщение #27


Знающий
****

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



Не нервничайте, спокойно читайте datasheet и RefMan; JTAG и осциллограф у вас, надеюсь, есть; проверяйте содержимое регистров.
Всё, что нужно было, всё было обсуждено.

Ждем положительного результата.


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


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

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



Код
#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 WREN();
void WRSR(u8 data);
void WRDI();

int main(void)
{
    SPI_Master_Conf();
    WREN();
    WRSR(0x8);
    WRDI();
    while(1)
    {
        RDSR();
    }
}

u16 answer=255;
u16 err=255;
void RDSR()
{
    Port->ODR&=~S;                                                         //выбираем чип
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    SPI_I2S_SendData(SPI1,0x05);                                         //команда СЧИТАТЬ РЕГИСТР
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    err=SPI_I2S_ReceiveData(SPI1);                                        //считываем байт - здесь фиктивны

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    SPI_I2S_SendData(SPI1,0b11111111);                                     //отправляем пустую команду, чтобы считать байт
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    answer=SPI_I2S_ReceiveData(SPI1);                                    //считываем байт
    Port->ODR|=S;                                                        //сброс чипа
}

void WRSR(u8 data)
{
    Port->ODR&=~S;                                                         //выбираем чип
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    SPI_I2S_SendData(SPI1,0b00000001);                                     //команда запись РЕГИСТРA
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    SPI_I2S_SendData(SPI1,data);                                        //передаем новое значение регистра
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    Port->ODR|=S;                                                         //сброс чипа
}
void WREN()
{
    Port->ODR&=~S;                                                         //выбираем чип
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    SPI_I2S_SendData(SPI1,0b00000110);                                     //команда разрешить запись - установить WEL бит
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    Port->ODR|=S;                                                         //сброс чипа
}

void WRDI()
{
    Port->ODR&=~S;                                                         //выбираем чип
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    SPI_I2S_SendData(SPI1,0b00000100);                                     //команда отмена рарешения записи
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);            //ждем, пока передатчик занят
    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);
    Port->ODR|=(S|HOLD|W);

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


почему-то так все работает....


спасибо всем за подсказки, ребята)) и за доходчивые и конкретные объяснения) wink.gif
Go to the top of the page
 
+Quote Post
Ekka
сообщение Apr 15 2016, 11:51
Сообщение #29


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

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



возник др.вопрос. Чтобы считать что-нибудь из памяти по адресу например, 0хА1, нужно:
выбрать чип
в регистр DR SPI-я положить команду
считать фиктивный байт
отправить адрес
считать фиктивный байт
отправить пустую команду
считать реальный ответ
сбрасывать чип не надо

ТАК? или при передаче адреса не надо фиктивный байты считывать?


и еще: как мне принять только один байт? и чтобы больше не принимать значений... по одному конкретному адресу может лежать только один байт?
Go to the top of the page
 
+Quote Post
Ekka
сообщение Apr 15 2016, 13:18
Сообщение #30


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

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



Вроде разобралась как принять байт из памяти. Начальный алгоритм был неправильный. Возник др.вопрос. Есть какая-то особенность записи байта в память. Не пойму, ЧТО именно пытаются сказать в документации.
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 Текстовая версия Сейчас: 17th June 2025 - 09:07
Рейтинг@Mail.ru


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