ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
3 мая
87034
Petr_ (19.04.2007 20:39, просмотров: 9491)
Вопрос по PIC30+C30+SPI+SD Если сделать обмен с картой программно, типа: <c> Rez=0; //начальное обнуление SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b10000000; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b01000000; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b00100000; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b00010000; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b00001000; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b00000100; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b00000010; SD_SCK=1; SD_SCK=0; if(SD_SDI) Rez|=0b00000001; return Rez; //результат </c> Проблем нет. А вот если попытаться приспособить модуль SPI начинаются чудеса. Инициализирую я его примерно так: <c> SPI1CONbits.MSTEN=1; //мастер режим SPI1CONbits.FRMEN=0; //никаких кадров SPI1CONbits.SPIFSD=0; //мастер режим SPI1CONbits.DISSDO=0; //SDO подключен к модулю SPI1CONbits.MODE16=0; //режим 8 бит SPI1CONbits.SMP=1; //данные считываются в конце такта SPI1CONbits.CKE=1; //данные выставляются в начале клока SPI1CONbits.SSEN=0; //SS линия не используется SPI1CONbits.CKP=0; //0-пассив 1-актив SPI1CONbits.PPRE=0b00; //первый делитель 1/16 SPI1CONbits.SPRE=0b111; //второй делитель 1/1 SPI1STATbits.SPIROV=0; //переполнения нет SPI1STATbits.SPISIDL=0; //модуль работает в IDLE режиме SPI1STATbits.SPIEN=1; //модуль включен </c> Внимательное разглядывание диаграммы работы в доках навело на мысль, что данные надо выставлять в начале клока. И это оказалось правильно (до того карта вообще не отвечала). При таком ините ответ карты есть, но из SPI1BUF лезет какая то чушь. Возникает мысль что считывать данные нужно уже после заднего фронта клока. Но такого режима то нет ! ???