|
|
  |
Память M95-256, stm32f100+M95-256 |
|
|
|
Apr 14 2016, 09:38
|

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

|
Цитата(Obam @ Apr 14 2016, 10:28)  Кодом в меня тыкать не надо (:
Смысл моего замечания таков: физически MOSI разведён на Q? физически MISO разведён на D? Если так, то хоть обпереопределяйся - лажа не исправится. Нет... у меня физически MISO разведен на Q, а MOSI - на D. подключено вроде все правильно...уже несколько раз перепроверено(
|
|
|
|
|
Apr 14 2016, 10:16
|

Частый гость
 
Группа: Участник
Сообщений: 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);//считываем байт
|
|
|
|
|
Apr 14 2016, 11:01
|

Знающий
   
Группа: Участник
Сообщений: 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 видели?
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Apr 14 2016, 11:57
|

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

|
Цитата(Ekka @ Apr 14 2016, 15:14)  Да. Но с пониманием туго(  Так приложите к ней рисунок со стр. 19 из CD00103810.pdf: SCK это C, MOSI это D, MISO это Q. Байт положили в DR, он автоматом переносится в сдвиговый регистр и начинает побитно отправляться ведомому; при этом ведомый побитно отдаёт свой байт ведущему. Все биты переданы (а соответственно и приняты) - тогда выставляется флаг RXNE => можно считать полученное.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Apr 14 2016, 12:42
|

Частый гость
 
Группа: Участник
Сообщений: 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 флаг установится, и забираю ответный байт?
|
|
|
|
|
Apr 14 2016, 12:49
|

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

|
Цитата(Ekka @ Apr 14 2016, 16:42)  Только чур камнями не бросать) Тогда выходит сначала я кладу в DR регистр мою команду, потом жду пока TXE флаг установится, потом передаю пустой байт, потом жду пока RXNE флаг установится, и забираю ответный байт? Не надо TXE сейчас использовать. Ваши действия таковы: "сначала я кладу в DR регистр мою команду, потом жду пока RXNE флаг установится, забираю фиктивный ответный байт потом передаю пустой байт, потом жду пока RXNE флаг установится, и забираю ответный байт? " В посте #19 уже и код был приведён.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Apr 14 2016, 13:12
|

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

|
Цитата(Ekka @ Apr 14 2016, 17:05)  Нет... что-то не так. Микросхема не отвечает. Хотя байты передаются. Микросхему проверили, протестили, рабочая, с др.устройством все прекрасно отвечает... хмм С каким "др.устройством все прекрасно отвечает"? Телепаты в отпуске (; Цитата Почему TXE сейчас не используем? ТXE - это флаг пустого DR, но не пустого сдвигового регистра; используется для того чтобы повысить пропускную способность SPI. На рис. 225 всё "до тла" разжёвано.
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Apr 15 2016, 07:24
|

Частый гость
 
Группа: Участник
Сообщений: 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); } почему-то так все работает.... спасибо всем за подсказки, ребята)) и за доходчивые и конкретные объяснения)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|