|
|
|
|
а lspclk от чего зависет у меня оно равно чётко частоте камня 120MHz ну как я понял это вроде делитель для перефирии |
|
|
ScibRegs.SCICTL1.bit.SWRESET=1; вот если резет не сделать то вроде как и неработает на отправку чего хоть он сбрасывает ? |
|
|
lspclk - это регистр предделителя низкоскоростной периферии, по умолчанию sysclockout/4. swreset сбрасывает все флаги, в принципе можно и без него обойтись, только долго и нудно. |
|
|
unsigned int MassCom[16]; interrupt void ReadCom(void) { int ll; EALLOW; for(ll=0;ll=15;ll++) MassCom[ll]=SciaRegs.SCIRXBUF.all; SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; PieCtrlRegs.PIEACK.all|=0x100; EDIS; } void main(void) { int vResult[3]; int k,nakop; long m,r; unsigned int Scorost; long i,j; for(i=0;i=15;i++) MassCom[i]=0; nakop=0; k=0; for(i=0;i=2;i++) vResult[i]=0; InitSysCtrl(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); EALLOW; PieVectTable.RXAINT = &ReadCom; //ссылка на процедуру по приходу прирывания PieCtrlRegs.PIECRTL.bit.ENPIE = 1; //включить группу прерываний переферии Pie PieCtrlRegs.PIEIER9.bit.INTx1=1; //включить девятое прерывание на приём из порта А IER=0x100; //включить девятое прерывание в процессоре EINT; //включить прерывание в процессоре EDIS; i=0; Scorost=(LSPCLK/(115200*8))-1; EALLOW; GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1; //включить переферию порт А нога отправки GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1; //включить перефирию порт А нога приёма SciaRegs.SCICCR.all=7; //настройки передачи SciaRegs.SCICTL1.all=3; //включение Tx Rx //SciaRegs.SCICTL1.RXERRINTENA=1; SciaRegs.SCIHBAUD=HIBYTE((int)Scorost); SciaRegs.SCILBAUD= LOBYTE((int)Scorost); // SciaRegs.SCICTL2.bit.TXINTENA =1; //включения прерывания SciaRegs.SCICTL2.bit.RXBKINTENA =1; //включение прерывания SciaRegs.SCIFFTX.bit.SCIFFENA=1; // fifo on off //SciaRegs.SCIFFRX.bit.RXFFIL=1; //Длина наименьшей команды SciaRegs.SCICCR.bit.LOOPBKENA =0; // Disable loop back //asm (" MOV @00705bh,#387h;");//SciaRegs.SCIFFRX.all=0x387; //0x0028; SciaRegs.SCIFFCT.all=0x00; //SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //сброс фифо SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //очистить флаг прерывания SciaRegs.SCIFFRX.bit.RXFFIENA=1; //включение прерывания SciaRegs.SCIFFRX.bit.RXFFIL=31; //уровень прерывания или длина пакета по которому сработает прерывание EDIS; SciaRegs.SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset for(i=0;i=4;) i=1; } Вот никак немогу понять по какому принцепу работает фифо в портах всё время непонятными кусками принимает посылаю в ручную через терминал 16 символов принимает почемуто не все предыдущие или ещё более древние |
|
|
Ну так, читать надо байты, а не слова. Для справки: размер фифо равен 16 слов. |
|
|
не а я что делаю у фифо по доке написано 16 слов равных одному байту тоесть 1слово=8 бит дока под номером SPRU051B там указано 16х8bit FIFO |
|
|
Diablo@Dragon: 1слово=8 бит Это что то новое, одно слово(word) всегда было 16бит или 2а байта.
|
|
|
Diablo@Dragon: не а я что делаю... 1) Ну не надо ля-ля, вот здесь: SciaRegs.SCIFFRX.bit.RXFFIL=31; //уровень прерывания или длина пакета по которому сработает прерывание вы установили 31 слово на чтение, а это недопустимо, учите матчасть. 2) А в этом фрагменте
unsigned int MassCom[16]; interrupt void ReadCom(void) { int ll; EALLOW; for(ll=0;ll=15;ll++) MassCom[ll]=SciaRegs.SCIRXBUF.all; . . . }
вы читаете из 16-битного регистра SCIRXBUF в 16-битный буфер MassCom, но принятые данные лежат в битах <7-0>.3) И ещё, SCI регистры не имеют EALLOW защиты, зачем вы используете EALLOW/EDIS команды? |
|
|
1) скажем так все единицы это какойто сброс 11111=31 походу да ошибся надо 10000=16 (вообщем я аналогию не проводил напрямую связь десятичных чисел и выставленных битов чёто даже в голову непришло) 2)ну да я неспорю маску надо наложить 3)EALLOW/EDIS теперь небуду ну и лучше как узнать где смотреть какие регистры защищённые какие нет |
|
|
насчёт слов я конечно понимаю что можно взять книжку класичиску возможно даже для писюка и прочитать что такое одно слова два слова и т.д но для меня слово это та минимальная единица с которой я могу работать причём не я один так считаю вот отрывок из книжки например (я думаю всё зависет от камня и типа памяти как она сделана и кней обращение как видётся) http://www.ikarab.narod.ru/Kea_22.html Энергонезависимая память. Начнем с энергонезависимой памяти (память программ и память данных). Информация, заложенная в энергонезависимую память, сохраняется при выключении питания, и поэтому именно в нее записывается программа. То место энергонезависимой памяти, куда записывается программа, называется памятью программ. Объем памяти программ может быть различен. Для PIC16F84A, он составляет 1024 слова. Это означает, что он предназначен для работы с программами, объем которых не превышает 1024 слов. Слово памяти программ не равно одному байту (8 бит), а больше его (14 бит). вообще говоря есть понятие машиное слово это минимальная единица памяти которой я могу обратится например для пиков это будет 8 бит для DSP96002 это будет 32бита для TMS320F2812 это 32 и 16 бит тоесть всё зависит от архитектуры процессора с точки зрения програмера то канечно на сях и дельфях word равен 0..65535 unsigned 16-bit может на других языках и также точно непомню |
|
|
|
|