Hedhehog

Работа С Картой Sd В Режиме Spi(Без Использования Fatfs)

16 сообщений в этой теме

Hedhehog    0

Форумчане, прошу помощи. Задача следующая: наладить связь между контроллером и флеш картой в режиме SPI, при этом когда будет производится запись данных файловая система не является необходимостью. Контроллер Xmega64A3. Флеш карта SDHC 4GB.

Для того, чтобы перевести флеш карту в режим инициализации, необходимо подать команду CMD0, приведенную в даташите на стандарт SD. Я отправляю эту команду, ловлю ответ (что характерно он таки есть) R1=0x20, т.е. Address error. И тут собственно вопрос: откуда эта ошибка возникает, может кто-нибудь сталкивался, знает как устранить.

Сразу скажу, код не выложил потому, что даже не предполагаю, где может быть ошибка.

Частота клока SPI 250кгц.

Частота клока контроллера 14,7мгц.

P.S. Прошу не сильно пинать, если тему сильно похожую создал или сообщение коряво написал-только осваиваю для себя форумы. :yes:

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


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

Вот правда для PIC, но там есть ссылки и для других МК: http://www.microchip.su/showthread.php?t=16973

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

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


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

Vovka, к сожалению, библиотеки мистера Чена не подходят-сам их рассматривал, но руководитель сказал разрабатывать свое. Да и FAT там присутствует.

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


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

Разработка своего-не моя прихоть, условие руководства ( к сожалению ). Поэтому эти библиотеки и были отброшены. Хотя статьи чана я внимательно изучил и сделал все четко по ним с учетом даташита на SD. Может недоучел что :yes:?

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

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


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

Дал ссылку на страничку обсужения - не помогло

Дал ссылку где посмотреть - не помогло.

Третья попытка:

зайди сюда: http://jonas.haksberg.net/post/Petit-FatFs-on-a-PIC18.aspx

и скачай в конце странички zip-архив!!!

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


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

Да изучил я ссылки.

Но библиотеки:

"pff.h"

(насчет следующих двух не уверен)

"GenericTypeDefs.h"

"HardwareProfile.h"

скорей всего написаны Чаном. Поэтому не могу использовать этот проект. Разве что как "отвлеченный пример"-на который можно взглянуть. Но в статье Чана все доходчиво расписано вроде бы, хотя лишний источник не помешает.

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


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

Тебе нужны файлы diskio.* - тут без всякого фата, вот функции:

DSTATUS disk_initialize (void); - инициализация

DRESULT disk_readp (BYTE*, DWORD, WORD, WORD); - чтение сектора

DRESULT disk_writep (const BYTE*, DWORD); - запись сектора

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


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

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

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


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

Я так понимаю, что в архиве лежит готовый проект под некую среду разработки для контроллеров PIC? (Программировал только в IAR и под AVR и то не сильно много :yes: )

И заработал именно этот проект, ссылку на который вы дали? ( Ну т.е. Petit FatFs )

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

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


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

Я так понимаю, что в архиве лежит готовый проект под некую среду разработки для контроллеров PIC? (Программировал только в IAR и под AVR и то не сильно много :yes: )

А если просмотреть все папки архива?

И заработал именно этот проект, ссылку на который вы дали? ( Ну т.е. Petit FatFs )

Ссылку уже в который раз давал! Ладно, вот ответ: http://www.microchip.su/showpost.php?p=210400&postcount=51

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


Ссылка на сообщение
Поделиться на других сайтах
Hedhehog    0
А если просмотреть все папки архива?

Я не сталкивался с пиковскими проектами, поэтому и поинтересовался.

А по поводу ссылки, я решил просто уточнить, правильно ли я вас понял на соседнем форуме. Т.е. именно это сообщение, на которое вы даете мне ссылку выше.

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


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

Я не сталкивался с пиковскими проектами, поэтому и поинтересовался.

В архиве есть папка sample:

в нем есть файл 00readme.txt, в котором написано:

Petit FatFs Module Sample Projects

DIRECTORIES

<generic> Generic microcontrollers with MMC

<avr> ATMEL AVR (ATtiny85) with MMC

<avr_boot> ATMEL AVR generic MMC boot loader

<pic> Microchip PIC (PIC24FJ46GA002) with MMC

<win32> Windows 2000/XP (VC++)

.....

А из папки src нужно взять два файла diskio.h и diskio.c, скопировать в свой проект и адаптировать под МК!

Все.

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


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

Надеюсь, что поможет. Если что - будем дальше "жевать"...

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Alexey104
      Всем привет!
      Возникла следующая проблема:
       
      Есть две ардуины 'Mega2560'. По несчастливому стечению обстоятельств данные платы попали в руки одному чуваку, который, вернув их, заявил, что они перестали работать после того, как он "чисто ради интереса" поковырял на обеих некоторые фьюзы. Есть у меня такой китайский usbasp v2 программатор:
      Подключив данный девайс к ICSP-пинам первой платы, удалось без проблем восстановить на ней загрузчик через стандартную Arduino-IDE, после чего работоспособность платы полностью восстановилась. Но вот при попытке сделать то же самое со второй платой, получаю это:
      Такое же сообщение получаю при попытке зашить загрузчик в неподключенную к программатору ардуину, то есть программатор вообще не видит МК. Плата прекрасно работала до того, как вышеупомянутый товарищ покрутил настройки фьюзов.
       
      Что я пытался предпринять:
      Замыкал пины JP3 программатора, отвечающие за понижение скорости, подключал к ардуине 5V от внешнего источника при прошивке загрузчика, - не помогло.
       
      Поиском пользоваться умею, аналогичную тему тут находил, но там проблема была в том, что парень неверно подключал программатор к контроллеру. В моём же случае всё подключено верно, повторюсь, что загрузчик первой платы этим же программатором был восстановлен успешно.
      Буду рад любым советам касательно того, как восстановить работоспособность платы.
       
       
       
    • Автор: Ru_s
      Здравствуйте. Подскажите пожалуйста, возможно ли на attiny13 реализовать такую штуку. Мне в процессе работы программы нужно поменять режим работы таймера/счетчика с fast PWM на обычный счёт, отсчитать длительный промежуток времени и опять вернутся в режим ШИМ. Т.е. я подаю на ногу сигнал ШИМ и когда он в максимальном значении, я его отключаю, и тупо подаю на ногу высокий лог. уровень. В это время Т/С по идее свободен, и мне надо посчитать время работы выхода на максимальном лог. уровне, при достижении какого-то значения времени нужно перевести т/с обратно в ШИМ. Возможно ли это? И как приблизительно это реализовать
    • Автор: ShimkoMax
      Здравствуйте. Требуется вывести данные температуры и влажности на экран. С LCD дисплеем разобрался, осталось разобраться с SHT21. Постоянно выводит 0 на дисплей:
      Main.c:
      #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include "globals.h" #include "LCD_lib.h" #include "twi.h" // I2C #include "sht21.h" int main(void) { I2C_Init(); _delay_ms(100); LCD_init(); char buffer[20]; roomAdrInit(); SHT21_reset(); while(1) { SHT21_reset(); LCD_sendString(itoa((int)get_temperature(), buffer, 10), 4, 0, 0); _delay_ms(1000); } } twi.c:
      #include <avr/io.h> #include "twi.h" void I2C_Init(void) { TWSR = 0; TWBR = 0x20; TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); } void I2C_StartCondition(void) { TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR & (1<<TWINT))); } void I2C_StopCondition(void) { TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); } void I2C_SendByte(uint8_t data) { TWDR = data; TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); } unsigned char I2C_ReadByteAck(void) { TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA); while(!(TWCR & (1<<TWINT))); return TWDR; } unsigned char I2C_ReadByteNak(void) { TWCR = (1<<TWINT) | (1<<TWEN); while(!(TWCR & (1<<TWINT))); return TWDR; } sht21.c:
      #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <stdio.h> #include "twi.h" #include "sht21.h" void SHT21_reset() { unsigned char reg[1]; reg[0]=SHT21_reset_cmd; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(*reg); I2C_StopCondition(); _delay_ms(100); } uint16_t checksum(unsigned char data[],uint8_t byte, uint8_t check) { uint8_t crc=0; uint8_t bytectr,bit; for (bytectr=0; bytectr<byte;bytectr++) { crc^=(data[bytectr]); for (bit=8;bit>0;bit--) { if(crc&0x80) { crc=(crc<<1)^polynomial; } else { crc=crc<<1; } } } if (crc!=check) { return 0; } else { return data; } } void write_user_register() { unsigned char reg[3]; reg[0]=user_register_write; reg[1]=0x44; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(*reg); I2C_StopCondition(); } uint16_t read_value(uint8_t reg) { char data[4],crc; uint16_t result; data[0]=reg; I2C_StartCondition(); I2C_SendByte(SHT21_i2c_write); I2C_SendByte(reg); I2C_StartCondition(); I2C_SendByte(SHT21_i2c_read); data[1] = I2C_ReadByteAck(); data[2] = I2C_ReadByteAck(); crc=I2C_ReadByteNak(); I2C_StopCondition(); result=(data[1]<<8) | data[2]; checksum(result,4,crc); result &= 0xFFFC; return result; } float get_humidity() { //char buffer2[4]; uint16_t hum_value = read_value(humidity_hold_mode); return -6 + 125.0 / 65536.0 * hum_value; //dtostrf(rh,5,2,buffer2); _delay_ms(100); } float get_temperature() { //char buffer1[4]; uint16_t temp_value = read_value(temperature_hold_mode); return -46.85 + 175.72 / 65536.0 * temp_value; //dtostrf(tc,5,2,buffer1); _delay_ms(100); }  
    • Автор: GeloMik
       
      Я новичок в программировании AVR контроллеров, хотя знаю +/- C++.
      Проблема заключается в том, что я не могу написать прошивку к своему маленькому проекту. Используемый мною контроллер - ATTiny45. У него на борту имеется 1 АЦП с выходом на 4 ноги. Нужно, чтобы фактически одновременно брался замер с 3, 4 и 5 порта по АЦП, и при появлении 1 на одном из них МК должен подать 5В на 1 или 2 порты. Источник АЦП AREF. 
      Сюда прикреплю схему самого робота, если кого не затруднит помочь написать прошивку, буду очень благодарен 

    • Автор: User_1
      Доброго времени суток!
      Вкратце: нужно после того, как я записал байт данных в SPI1->DR, отменить передачу этого байта и вместо него отправить 0х00
      Подробно: Смысл вот в чём: некий контроллер, с которым я пытаюсь наладить общение по SPI, запрашивает произвольный участок массива байт и считывает их сплошным потоком. Ну примерно как считывается микросхема EEPROM: задаёшь начальный адрес, а потом просто шлёшь сплошные 0xFF, а она сама инкрементирует адрес и прямо непрерывным потоком байт выдаёт содержимое памяти. Только тут в роли этой микросхемы мой stm32f030 и мне нужно следующий байт отправлять в SPI1->DR сразу после отправки предыдущего. Но когда поток заканчивается (а он каждый раз разной длины и длина эта заранее неизвестна), один байт остаётся не переданным и отправится первым при следующем запросе. А мне нужно, чтобы первым байтом всегда отправлялся 0х00
      Пином (ну то есть битом) NSS управляю программно, его выставление в единичку и снова в ноль, очевидно, не помогает вообще никак. Пока решил проблему так: деинициализирую модуль SPI и выключаю его тактирование, затем включаю тактирование и снова инициализирую. Работает, скорости хватает. Но должно же быть менее костыльное решение?)
      Может кто сталкивался с такой проблемой?
      Курение даташита, reference manual и результатов поиска в гугле, не особо помогло.
  • Сообщения

    • Согласен, что лучше 31-ти полосный, но догоровато приобретать для экспериментов 
    • не может быть   Ну ОК, можно сделать, только надо и ЖК отключать. Выбери два порта какие удобней использовать.
    • а в-третьих, в программе указывается ПОЛНОЕ напряжение питания. то есть, 325 Вольт.
    • По поводу эквалайзера: в ПРО сфере используют 31-полосный графический эквалайзер, для каждого канала свой. Мнению интернета доверять вообще не советую, если есть возможность, общайтесь с профессионалами от аудио и учитесь у них, на крайняк - читай профессиональные аудио ресурсы. 
    • Да, просто хочу быстро разрядить конденсатор на катушку индуктивности спомощью ключа, который нужно быстро открыть и закрыть (зарядить ёмкость, и разрядить) А в данный момент уменя прямое управление (плавающее) с ноги МК. Нужен драйвер на мосфет. Частота управления 1-19кгрц , нагрузки на мосфет нет никакой возможно. Дак вот пытаюсь узнать от вас драйвер использует коеф уселения тока со входа МК? Или он ещё с батарей потянет большой ток для заряда транзистора ёмкости чтоб открыть его. Как ещё обьяснить не знаю...
    • Подготовка помещения это здорово, но сложно и дорого. Корректировка АЧХ хотя бы частично исправить ситуацию. Пробовал делать всякие бас ловушки, панели, результат мизер, а комната превращается непонятно во что. Что касается АЧХ и эквалайзеров вставлю свои 5 копеек. АЧХ в обычной жилой комнате будет мягко говоря кривая. У себя в комнате проводил замеры АЧХ с помощью измерительного микрофона и программы Room EQ Wizard. Вид АЧХ как Уральские горы. Двигал колонки по комнате туда-сюда так и не добился более-менее ровной АЧХ . На одних частотах горб исчезает на других появляется, тоже самое с провалами. В итоге поставил колонки на слух, появилась более-менее панорама звука, сцена. Замерил АЧХ, вот результат: Желтый цвет левый канал Зеленый цвет правый канал Красный цвет оба канала Пробовал выравнить АЧХ с помощью программого эквалайзера. Да, АЧХ стала ровней, звук стал другой ( не умею описывать), но звук стал утомлять. Возможно программый эквалайзер его портит. Вообщем не понравилось. Надо попробовать физический эквалайзер. Мнение в инет противоречивое об эквалайзерах. Половина считает это убийца звука, другая половина звук улучшается.  Мое мнение (возможно ошибаюсь), что эквалайзером можно подрезать горбы АЧХ, а провалы поднимать не стоит. Горб это сумма прямого и отраженного сигнала в одной фазе, т.е. не искаженный сигнал, а провал это сумма прямого и отраженного сигнала в противофазе, т.е искаженный сигнал. Усиливать искаженный сигнал не стоит, например вместо баса усилим гудеж. Эквалайзер нужен на 20 полос минимум и на каждый канал АЧХ выравнивать по отдельности.