Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
06.10.2008, 06:35
|
|
Частый гость
Регистрация: 28.11.2007
Сообщений: 48
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
маюсь дальше
подцепил в протеусе осцилограф кинул его на все порты карточки. в mmcinit после цикла spi(0xff) кинул кусочек как и посоветовали
Код:
|
do{
DelayMs(10);
}while (Command(0x40,0,0,0x95) != 1); |
в осцилографе прекрасно видно клок и улетающий набор команд но от карточки 0;
дальше идеи заканчиваются;(
..
посмотрел что строка
Код:
|
PORTB &= ~(1 ‹‹ SPICS); // enable MMC |
не на месте передвинул, до цикла, теперь цикл с командой вообще не обрабатывается т.е. даже в осцилографе ничего нет
.. в регистре spdr болтается 40 т.е. второй байт из пакета command и на этом деле все висит
|
|
|
|
06.10.2008, 10:25
|
|
Частый гость
Регистрация: 28.11.2007
Сообщений: 48
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
а если убрать все именения CS то тогда развисает в цикле все нормлаьно на осцилографе видно но ответа по прежнему нет.
Понять не могу вот ведь совсем простой алгоритм
включили питание
подождали 1 мс
настроили spi на мк
подняли cs
послали 10 ff, карточка ушла в софтовый резет
опустили cs
подождали немного
послали cmd0 получили ответ не равный 0
послали cmd1 ну и дальше читаем сектора
а тут фигня какаято, что же такое происходит то? ведь я делал под протеусом на cavr, писал на карточку, а в железе потом не заработало.
|
|
|
|
06.10.2008, 12:23
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Может, просто другую карточку возьми ? У всех ведь работает.
У меня, например , так
Код:
|
do{
DelayMs(10);
}while (mmc_init() != 0);
// долбим, пока карта не включится, сцуко
unsigned char mmc_init (void)
{
unsigned char b;
unsigned int Timeout = 0;
mmc_dis();
for ( b = 0;b‹0x0f;b++) //
{
mmc_write_byte(0xff);
}
//--------------------------------------------------
while(mmc_write_command (CMD) !=1)// код 0х40 - это сброс карты карта должна ответить 01
{
if (Timeout++ › 200)
{
mmc_dis();
return(1);
}
}
//----------------------------------------------
Timeout = 0;
CMD[0] = 0x41;//Commando 1// 0х41 - инициализация карты должна ответить 00
CMD[5] = 0xFF;
while( mmc_write_command (CMD) !=0)
{
if (Timeout++ › 400)
{
mmc_dis();
return(2);
}
}
mmc_dis();
return(0);
}
//--------------------------------------------------------------------- |
|
|
|
|
07.10.2008, 03:23
|
|
Частый гость
Регистрация: 28.11.2007
Сообщений: 48
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Как в протеусе можно взять другую карту ? эта нормально работала, правда недолго и как то криво, но работала. Пример с картой из поставки модели карточки работает. Правда там лишние резисторы все убраны, попробовать тоже так сделать может заведется.
|
|
|
|
07.10.2008, 09:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Я имел в виду железо.... Что, и в протеусе обмен глючит ?
|
|
|
|
07.10.2008, 11:38
|
|
Временная регистрация
Регистрация: 09.03.2007
Сообщений: 75
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Итак, я собрал устройство ниже. Устройство состоит из модулей. Цель такого подхода к разработке в том, чтобы как можно меньше производить платы и как можно быстрее осваивать ту или иную микросхему. Т.е. мне не нужно покупать дорогие евуалэйшн боарды, достоточно подцепить, что нужно из уже готового.
Модули собираются таким образом, чтобы как можно меньше вставлять проводков и как можно больше была помехоустойчивость и стабильность. Т.е. все пины на землю через 100К, на питании 10мкФ и т.д.
Слева находится модуль SD/MMC карт для общения с ними по SPI. В центре модуль МК, PIC16F73 - единственный МК, который у меня остался в запасах . Справа на верху в TO-92, это LM317LZ. Он преобразует напряжение в 3,55В и может выдавать 100мА. И, наконец, справа внизу - MAX232. Для общения с компом. Питание для сего девайс
а подаётся от старого БП компьютера. Ниже следующий код, написанный вчера под хайтековский компилятор для 16х, позволяет общаться с карточкой.
Код:
|
#include ‹PIC.h›
__CONFIG(HS&WDTDIS&PWRTEN&BORDIS);
...
unsigned char SendSPI (unsigned char TX)
{
SSPBUF=TX;
while(!STAT_BF)
{}
return SSPBUF;
}
unsigned char CommandSPI (unsigned char CMD, unsigned long ADDR, unsigned char CRC)
{
SendSPI (CMD);
SendSPI (*((unsigned char *)&ADDR + 3));
SendSPI (*((unsigned char *)&ADDR + 2));
SendSPI (*((unsigned char *)&ADDR + 1));
SendSPI (*((unsigned char *)&ADDR + 0));
SendSPI (CRC);
}
...
main()
{
//Настройка прерываний
GIE=1;
PEIE=1;
///////////////////
...
//Настройка USART
SPBRG=10; //115 200 kbps
SYNC=0;
BRGH=1;
SPEN=1;
TXEN=1;
CREN=1;
RCIE=1;
/////////////////
//Настройка SPI
///////Настройка портов
TRISC=0b11010011;
PORTC=0x0;
///////////////////////
//////Настройка параметров
STAT_SMP=1;
STAT_CKE=1;
CKP=0;
SSPEN=1;
RC2=1;
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
SendSPI(0xFF);
RC2=0;
CommandSPI(0x40,0x0,0x95);
while (SendSPI(0xFF)!=1)
{};
... |
Ну а дальше не важно, потому что уже на этом этапе она проходит, если карточка вставлена, и не проходит, если не вставлена. Возможно проблема в том, что Вы посылаете команду и не ждёте ответа, попробуйте дополнить как у меня:
Код:
|
while (SendSPI(0xFF)!=1)
{}; |
-- Прилагается рисунок: --
|
|
|
|
07.10.2008, 11:54
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
И что ?
|
|
|
|
07.10.2008, 14:19
|
|
Временная регистрация
Регистрация: 09.03.2007
Сообщений: 75
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от urry
|
И что ?
|
Долго я, да
Кстати, мне нравится Ваша аватарка, почти как с сигареткой.
P.S.
Курение вредит Вашему здоровью.
|
|
|
|
07.10.2008, 19:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Мне это уже на микрочипе говорили (учитывая, видимо, качество постов) ... Ну, это я в Одессе на пляже чинарик подобрал...
|
|
|
|
08.10.2008, 03:19
|
|
Частый гость
Регистрация: 28.11.2007
Сообщений: 48
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
компилятор winavr мк атмега 8 все пока в протеусе, код взят у капитана
Вот мой код:
Код:
|
#include ‹mmccommand.h›
#define SPIDI PB4 // Port B bit 6 (pin7): data in (data from MMC)
#define SPIDO PB3 // Port B bit 5 (pin6): data out (data to MMC)
#define SPICLK PB5 // Port B bit 7 (pin8): clock
#define SPICS PB2 // Port B bit 4 (pin5: chip select for MMC |
Код:
|
char SPI(char d)
char received = 0;
SPDR = d;
while(!(SPSR & (1‹‹SPIF)));
received = SPDR;
return (received);
}
void SPI_MasterInit(void)
DDRB &= ~(1 ‹‹ SPIDI); // set port B SPI data input to input
DDRB |= (1 ‹‹ SPICLK); // set port B SPI clock to output
DDRB |= (1 ‹‹ SPIDO); // set port B SPI data out to output
DDRB |= (1 ‹‹ SPICS); // set port B SPI chip select to output
SPCR = (1 ‹‹ SPE) | (1 ‹‹ MSTR) | (1 ‹‹ SPR1) | (1 ‹‹ SPR0);
}
char Command(char befF, uint16_t AdrH, uint16_t AdrL, char befH )
{ // sends a command to the MMC
SPI(0xFF);
SPI(befF);
SPI((uint8_t)(AdrH ›› 8));
SPI((uint8_t)AdrH);
SPI((uint8_t)(AdrL ›› 8));
SPI((uint8_t)AdrL);
SPI(befH);
SPI(0xFF);
//PORTB &= ~(1 ‹‹ SPICS); // return the last received character
return SPI(0xFF);
}
int MMC_Init(void) { // init SPI
char i;
delay_ms(100);
// start MMC in SPI mode // CS DI hight
PORTB |= (1 ‹‹ SPICS);
for(i=0; i ‹ 10; i++) { // send 10*8=80 clock pulses
SPI(0xff);
}
PORTB &= ~(1 ‹‹ SPICS); // enable MMC
delay_ms(1);
// готовы принимать команды CS low шлем cmd0
uart_puts("MMC_GO_IDLE_STATE");
serialterminate();
while (Command(MMC_GO_IDLE_STATE,0,0,0x95)!=1)
{
//Тут висим :( на осциле видно что идет передача но от карточки ничего нет
}; |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:08.
|
|