AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
11.02.2014, 09:03
|
|
Прописка
Регистрация: 25.10.2012
Сообщений: 112
Сказал спасибо: 50
Сказали Спасибо 1 раз в 1 сообщении
|
ATmega32, программный SPI для карты памяти
Добрый вечер!
Итак, разбираюсь с программным SPI на ATmega32 для работы с картой памяти SD. Главное, что нужно сделать, это функции чтения и записи байта. С картой планируется работать в режиме SPI 0. (За основу взял проект Dharmani, но у него нет программного SPI, а аппаратный у меня занят).
SanDisk Secure Digital Card Product Manual, страница 35:
Как я понял, режим SPI 0 сохраняется только для передачи информации карте, а вот обратно, что это?
Вот какие функции написал:
Код:
|
#define SPISPEED 8 //period takta SPI, usec
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1‹‹BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1‹‹BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1‹‹BIT))
#define SWSPI_PORT PORTC
#define SWSPI_DDR DDRC
#define SWSPI_PIN PINC
#define SWSPI_SCK PC5
#define SWSPI_MOSI PC6
#define SWSPI_MISO PC7
#define SWSPI_CS PC4
#define SETCLK() SETBIT(SWSPI_PORT,SWSPI_SCK)
#define CLRCLK() CLEARBIT(SWSPI_PORT,SWSPI_SCK)
#define SETMOSI() SETBIT(SWSPI_PORT,SWSPI_MOSI)
#define CLRMOSI() CLEARBIT(SWSPI_PORT,SWSPI_MOSI)
#define CLRMISO() CLEARBIT(SWSPI_PORT,SWSPI_MISO)
#define ACTIVE_SPI() CLEARBIT(SWSPI_PORT,SWSPI_CS)
#define PASSIVE_SPI() SETBIT(SWSPI_PORT,SWSPI_CS)
void SWSPI_write_byte (unsigned char byte)
{
CLRMOSI(); CLRCLK();
for (unsigned char a=8; a›0; a--) //MSB First
{
CLRCLK();
_delay_us(SPISPEED/4); /* ждём четверть периода */
if (CHECKBIT(byte,(a-1)))
SETMOSI(); //Set Output High
else
CLRMOSI(); //Set Output Low
_delay_us(SPISPEED/4); /* ждём четверть периода */
SETCLK();
_delay_us(SPISPEED/4); /* ждём четверть периода */
CLRMOSI();
_delay_us(SPISPEED/4); /* ждём четверть периода */
}
CLRMOSI(); CLRCLK();
} |
Для 0xAA (10101010) вот что:
Для приема информации от карты делаю считывание на середине импульса SCK (или по таймингам лучше при спаде?)
Код:
|
unsigned char SWSPI_read_byte ()
{
unsigned char RByte = 0x00;
SETMOSI(); CLRCLK(); CLRMISO();
for (unsigned char a=8; a›0; a--) //MSB First
{
_delay_us(SPISPEED/4); /* ждём четверть периода */
SETCLK();
_delay_us(SPISPEED/4);
if (CHECKBIT(SWSPI_PIN,SWSPI_MISO)) //Check Bit
RByte |= (1 ‹‹ (a-1)); //Set bit
_delay_us(SPISPEED/4);
CLRCLK();
_delay_us(SPISPEED/4);
}
return RByte;
} |
Например, передача байта от Slave к Master'у. Не понятно, как (согласно SPI 0) Slave должен начать подтягивать MISO к питанию, если Master еще не подтянул SCK (особенно при первом бите в байте)?
Последний раз редактировалось pavned; 11.02.2014 в 09:16.
|
|
|
|
11.02.2014, 11:12
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: ATmega32, программный SPI для карты памяти
Используйте SPI DEBUGGER. Или давайте проект, мы используем.
И что за бред на счет того, что SPI занят? Он же мультиплексируется ногой CS.
|
|
|
|
11.02.2014, 11:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,050
Сказал спасибо: 3,041
Сказали Спасибо 3,210 раз(а) в 2,180 сообщении(ях)
|
Re: ATmega32, программный SPI для карты памяти
Сообщение от pavned
|
SPI, а аппаратный у меня занят
|
А если уж так сильно занят - можно попробовать USART в синхронном режиме прикрутить.
|
|
|
|
11.02.2014, 12:04
|
|
Прописка
Регистрация: 25.10.2012
Сообщений: 112
Сказал спасибо: 50
Сказали Спасибо 1 раз в 1 сообщении
|
Re: ATmega32, программный SPI для карты памяти
Сообщение от Easyrider83
|
Используйте SPI DEBUGGER. Или давайте проект, мы используем.
И что за бред на счет того, что SPI занят? Он же мультиплексируется ногой CS.
|
Вы правы, начать наверное стоит с того, что Ethernet модуль на ENC28J60 И SD модуль ни в какую не получилось запустить на аппаратном SPI. Хотя МК мастер, эти оба слейвы...
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:25.
|
|