Как переделать работу с картой SD вместо SPI на USART

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

Приветствую!

Пытаюсь переделать библиотеку Чана для работы с SD-картами с SPI на USART (т.е. режим SPI через USART). МК - мега 328, 4 Мгц.

Есть вопросы:

1. какие ноги (PORT/DDR) МК надо сконфигурировать (кроме XCK)

2. как правильно инициализировать UART. У меня получилось так:

Код: Выделить всё

#define  SYSCLK         4000000UL 
#define SD_UART_BAUDRATE   100000L 
#define SD_UART_BAUD (SYSCLK/(2*SD_UART_BAUDRATE))-1 

#define SD_PORT PORTD 
#define   SD_DDR   DDRD 
#define   SD_XCK  4 
... 

UBRR0 = 0; 
SD_DDR |= (1<<SD_XCK); 

UCSR0C = (1<<UMSEL01)|(1<<UMSEL00)|(0<<UCPHA0)|(0<<UCPOL0); 
UCSR0B = (1<<RXEN0)|(1<<TXEN0); 
UBRR0 = SD_UART_BAUD;
может кто-то уже преобразовал работу SD-карты с SPI на USART и может поделится diskio.c (mmc.c)?

P.S. убедительная просьба не спрашивать для чего это нужно. Для спортивного интереса :)

благодарю!!!
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение Aheir »

Не осознал... Т.е. интерфейс работы непосредственно с картой - USART? Это как? :shock:
Оптимизм х (Опыт + Знания) = const
Реклама
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение phanis »

Из даташита
20. USART in SPI Mode
20.1 Features
• Full Duplex, Three-wire Synchronous Data Transfer
• Master Operation
• Supports all four SPI Modes of Operation (Mode 0, 1, 2, and 3)
• LSB First or MSB First Data Transfer (Configurable Data Order)
• Queued Operation (Double Buffered)
• High Resolution Baud Rate Generator
• High Speed Operation (fXCKmax = fCK/2)
• Flexible Interrupt Generation

USART_MSPIM SPI Comment
TxDn MOSI Master Out only
RxDn MISO Master In only
XCKn SCK (Functionally identical)
(N/A) SS Not supported by USART in MSPIM
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

кто может проверить правильно ли прописана инициализация USART? :)
Реклама
Эиком - электронные компоненты и радиодетали
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение phanis »

Написана инициализация по даташиту, если пользуетесь протеусом можно там проверить spi-debugger - ом , Нужно будет дописать программу отправки приема..
И вот пример набросал. Может выглядит не очень но работает..

Код: Выделить всё

#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>

#define SD_UART_BAUDRATE   100000L
#define SD_UART_BAUD (F_CPU/(2*SD_UART_BAUDRATE))-1 
#define SD_PORT PORTD
#define   SD_DDR   DDRD
#define   SD_XCK  4 //Clock
#define   SD_CS   3 //Chip select

unsigned char SPI_Send(unsigned char data);

int main(void)
{
unsigned char i;

UBRR0 = 0;
SD_PORT |= (1<<SD_CS)|(1<<SD_XCK);
SD_DDR |= (1<<SD_CS)|(1<<SD_XCK);

UCSR0C = (1<<UMSEL01)|(1<<UMSEL00)|(1<<UDORD0)|(0<<UCPHA0)|(1<<UCPOL0);
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UBRR0 = SD_UART_BAUD;
DDRB = 0xFF;
i=0;
while (1)
            {
             _delay_ms(100);
              SD_PORT &=~(1<<SD_CS);
              PORTB = SPI_Send(i++);// ОТправляем по SPI(из USART - та) и Выводим в порт то что приняли
              SD_PORT |= (1<<SD_CS);
           }

}

unsigned char SPI_Send(unsigned char data)
{

UCSR0C = (1<<UMSEL01)|(1<<UMSEL00)|(1<<UDORD0)|(0<<UCPHA0)|(1<<UCPOL0);
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Wait for empty transmit buffer */

while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */
UCSR0B = 0;
UCSR0C = 0;
return UDR0;

}
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение Aheir »

А, так Вы в МК UART в SPI-mode загоняете... Я-то уж было решил, что Вы у SD-карты UART обнаружили... Ну и испугался как-то..
:)
Оптимизм х (Опыт + Знания) = const
Реклама
Аватара пользователя
БАТАРЕЙКУС
Потрогал лапой паяльник
Сообщения: 346
Зарегистрирован: Сб фев 07, 2009 19:21:25

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение БАТАРЕЙКУС »

Aheir писал(а):А, так Вы в МК UART в SPI-mode загоняете... Я-то уж было решил, что Вы у SD-карты UART обнаружили... Ну и испугался как-то..
:)
а смысл сего чем вам SPI-неподходит то.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

уважаемый phanis,
на какой megе вы проверяли?

для чего нужно
DDRB = 0xFF; ?

для чего при отправке по SPI заново инициализируется USART?

и для чего в PORTB идет запись битов?
на сколько я понимаю, все должно отправлятся через RX, иначе это уже программный SPI когда запись битов в порт, а не SPI через USART

спасибо!
Последний раз редактировалось radio-by Пн янв 23, 2012 10:58:43, всего редактировалось 1 раз.
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение phanis »

МК - мега 328
проверял в протеусе осциллографом и спи дебугером.
порт б использовал для вывода принятого байта. для наглядности.
инициализировал заново потому что,
после передачи первога байта, USART продолжает работать, не останавливается, в чем дело, я не знаю.
Возможно в моей не внимательности, при изучении даташита. Поэтому инициализирую перед отправкой и обнуляю регистры после отправки.
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

phanis писал(а):МК - мега 328
после передачи первога байта, USART продолжает работать, не останавливается, в чем дело, я не знаю.
Возможно в моей не внимательности, при изучении даташита. Поэтому инициализирую перед отправкой и обнуляю регистры после отправки.
может после отправки надо проверять на TXC?
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение phanis »

Скорее всего дело в симуляторе протеусе. Когда обнуляешь бит UCPHA0 Clock Phase, начинает без остановки что то шлепать.А если единичка, то и в симуляторе норм.
Поэтому придется все в железяке или в каком то другом симуляторе проверять. А так по даташиту все ок.

Код: Выделить всё

#include <stdlib.h>
#include <avr/io.h>
#include <util/delay.h>

#define SD_UART_BAUDRATE   100000L
#define SD_UART_BAUD (F_CPU/(2*SD_UART_BAUDRATE))-1 
#define SD_PORT PORTD
#define SD_DDR   DDRD
#define SD_XCK  4 //Clock
#define SD_CS   3 //Chip select

unsigned char SPI_Send(unsigned char data);

int main(void)
{
unsigned char i;

UBRR0 = 0;

SD_PORT |= (1<<SD_CS)|(1<<SD_XCK);

SD_DDR |= (1<<SD_CS)|(1<<SD_XCK);

UCSR0C =  (1<<UMSEL01)|(1<<UMSEL00)|(1<<UDORD0)|(1<<UCPHA0)|(1<<UCPOL0);

UCSR0B = (1<<RXEN0)|(1<<TXEN0);

UBRR0 = SD_UART_BAUD;

DDRB   = 0xFF;
i = 0;
while (1)
{
_delay_ms(200);

SD_PORT &=~(1<<SD_CS);
asm("nop");
PORTB = SPI_Send(1);
asm("nop");
 SD_PORT |= (1<<SD_CS);
}


}
unsigned char SPI_Send(unsigned char data)
{


/* Wait for empty transmit buffer */

while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */

return UDR0;

}
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

а почему вы устанавливаете UCPOL0 в 1?

SPI mode = 0 если UCPOL0 = 0 и UCPHA = 0
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

не знаю как у вас, у меня при симуляции почему-то на входе одни "?"
версия 7.7 сп2

исходник брал ваш последний

спасибо
Вложения
usartspi1.jpg
(195.73 КБ) 594 скачивания
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение Engineer_Keen »

А откуда там что-то должно быть? Линия данных в воздухе висит (HI-Z). Она со стороны МК - вход, а с другой стороны дебаггер в режиме монитора.
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

теперь ваш пример работает. но с карточкой на spi-дебагере c выхода карты идут ???, а в режиме аппаратного spi на spi-дебагере в том же режиме монитора идёт правильный ответ с карточки... :(
radio-by
Родился
Сообщения: 9
Зарегистрирован: Чт янв 19, 2012 12:02:00

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение radio-by »

phanis, какая у вас версия шпрот? :)
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: Как переделать работу с картой SD вместо SPI на USART

Сообщение phanis »

7.8 sp2 сборка 10468 с расширенным моделированием.
так написано О программе ISIS
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»