gegel 0 13 мая, 2012 Опубликовано 13 мая, 2012 · Жалоба Может, функция управления пинами unblocked? Для гарантии попробуйте дергать в 0 и затем в 1 отдельными командами и считать в отдельные счетчики: посмотрим, только ли фронт или спад сбоят, или же оба. Затем введите две задержки в 2-4 мкс между дерганьями и посмотрите результат. В любом случае, даже если выйдете на 10 мкс периода тактового сигнала, то это вполне приемлемый результат. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Romashki 0 16 августа, 2012 Опубликовано 16 августа, 2012 · Жалоба Вроде бы получилось написать свои функции SPI....но пришлось использовать комбинации, которые Симком запрещает.....ну...пока деваться некуда.... это функции типа while(ebdat6_04WriteGpio(EEPROM_SELECT,0)!=FL_OK); Функции, которые получились: bool eeprom_ready(void) { u8 tmg; while(ebdat6_04WriteGpio(EEPROM_SELECT,0)!=FL_OK); send_byte(0x05); tmg=read_byte(); while(ebdat6_04WriteGpio(EEPROM_SELECT,1)!=FL_OK); if((tmg&0x01) || !(tmg&0x02))return 0; else return 1; } u8 read_byte(void) { u8 a,dats=0; bool mBits; for(a=0;a<8;a++) { while(ebdat6_04WriteGpio(EEPROM_CLK, 1)!=FL_OK); dats<<=1; while(ebdat6_05ReadGpio(EEPROM_DI,&mBits)!=FL_OK); if(mBits)dats|=1; while(ebdat6_04WriteGpio(EEPROM_CLK, 0)!=FL_OK); } return dats; } void send_byte(u8 bt) { u8 i; for(i=0;i<8;i++) { if(bt&0x80)while(ebdat6_04WriteGpio(EEPROM_DO,1)!=FL_OK); else while(ebdat6_04WriteGpio(EEPROM_DO,0)!=FL_OK); while(ebdat6_04WriteGpio(EEPROM_CLK, 1)!=FL_OK); bt<<=1; while(ebdat6_04WriteGpio(EEPROM_CLK, 0)!=FL_OK); } } //****************************************************************** void write_ext_eeprom (u32 address,u16 count,u8 *bfur) { u16 i; init_ext_eeprom(); while(ebdat6_04WriteGpio(EEPROM_SELECT,0)!=FL_OK); send_byte(0xAD); send_byte(address>>16); send_byte(address>>8); send_byte(address); send_byte(bfur[0]); /* send 1st byte to be programmed */ send_byte(bfur[1]); /* send 2nd byte to be programmed */ while(ebdat6_04WriteGpio(EEPROM_SELECT,1)!=FL_OK); for(i=2;i<count;i+=2) { ebdat05_09delay(10);//microseconds while(ebdat6_04WriteGpio(EEPROM_SELECT,0)!=FL_OK); send_byte(0xAD); send_byte(bfur); /* send 1st byte to be programmed */ send_byte(bfur[i+1]); while(ebdat6_04WriteGpio(EEPROM_SELECT,1)!=FL_OK); } ebdat05_09delay(10);//microseconds while(ebdat6_04WriteGpio(EEPROM_SELECT,0)!=FL_OK); /* enable device */ send_byte(0x04); /* send WRDI command */ while(ebdat6_04WriteGpio(EEPROM_SELECT,1)!=FL_OK); /* disable device */ ebdat05_09delay(10);//microseconds eeprom_ready(); init_ext_eeprom(); } //****************************************************************** void read_ext_eeprom(u32 address,u16 count,u8 *bfur) { u16 i; while(ebdat6_04WriteGpio(EEPROM_SELECT,0)!=FL_OK); send_byte(0x03); send_byte(address>>16); send_byte(address>>8); send_byte(address); for(i=0;i<count;i++)bfur=read_byte(); while(ebdat6_04WriteGpio(EEPROM_SELECT,1)!=FL_OK); } //****************************************************************** Можно даже без ebdat05_09delay(10); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bugish 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Вот и мне пришлось вплотную использовать SPI начал на 25LC160 16K SPI™ Bus Serial EEPROM пришла в голову мысль использовать функции SPI из EAT, а под ChipSelect использовать GPIO11, все отлично работает. Появилась необходимость использовать АЦП adc084s021 SPI 4-chanel 8-bit, но там необходимо писать и читать одновременно после 4-го SLK, и стандартные функции ЕАТ уже не катят, как с EEPROM (там все просто начала запись потом чтение). Пришлось написать свои функции на основе предидущего сообщения. Было бы хорошо иметь совмещенную во времени функцию SpiWriteReadByte() ,чтоб писала и читала одновременно (такой пользовались на Siemens TC-65). Так как нет фунции SpiUnsubscribe() "освободить ноги", то пришлось делать две SPI-шины одна для SPI-аппаратная, вторая SPI-программная. Пример с использованием альтернативнго SC. void WR_SPI_D(u16 addr, u8 data_SPI) /*WRITE BYTE 25LC160 SC->GPIO11*/ { /*Set the write enable latch (enable write operations)*/ ebdat6_04WriteGpio(FL_PIN_67, 0); ebdat5_02SpiWriteByte(0x06); ebdat6_04WriteGpio(FL_PIN_67, 1); ebdat6_04WriteGpio(FL_PIN_67, 0); ebdat5_02SpiWriteByte(0x02); ebdat5_02SpiWriteByte(addr>>8); ebdat5_02SpiWriteByte(addr & 0xFF); ebdat5_02SpiWriteByte(data_SPI); ebdat6_04WriteGpio(FL_PIN_67, 1); } /*-----------------------------------------------------------*/ u8 RD_SPI_D(u16 addr) /*READ BYTE 25LC160 SC->GPIO11*/ { u8 data_r=0; ebdat6_04WriteGpio(FL_PIN_67, 0); ebdat5_02SpiWriteByte(0x03); ebdat5_02SpiWriteByte(addr>>8); ebdat5_02SpiWriteByte(addr & 0xFF); data_r = ebdat5_03SpiReadByte(); ebdat6_04WriteGpio(FL_PIN_67, 1); return data_r; } /*-----------------------------------------------------------*/ void WR_SPI_SR( u8 data_SPI) /*WRITE STATUS REGISTER 25LC160 SC->GPIO11*/ { /*Set the write enable latch (enable write operations)*/ ebdat6_04WriteGpio(FL_PIN_67, 0); ebdat5_02SpiWriteByte(0x06); ebdat6_04WriteGpio(FL_PIN_67, 1); ebdat6_04WriteGpio(FL_PIN_67, 0); ebdat5_02SpiWriteByte(0x01); ebdat5_02SpiWriteByte(data_SPI); ebdat6_04WriteGpio(FL_PIN_67, 1); } /*-----------------------------------------------------------*/ u8 RD_SPI_SR(u16 addr) /*READ STATUS REGISTER 25LC160 SC->GPIO11*/ { u8 data_r=0; ebdat6_04WriteGpio(FL_PIN_67, 0); ebdat5_02SpiWriteByte(0x05); data_r = ebdat5_03SpiReadByte(); ebdat6_04WriteGpio(FL_PIN_67, 1); return data_r; } /*-----------------------------------------------------------*/ /* Initialization SPI*/ ebdat5_01SpiConfigure( SSI_4WIRE, SSI_ACTIVE_LOW, FL_PIN_14, SSI_SYSTEM_DIV_512, SSI_FALLING_EDGE, SSI_MSBFIRST); if (ebdat6_08pinConfigureToUnused(FL_PIN_67) == FL_OK) if (ebdat6_02GpioSubscribe(FL_PIN_67,FL_GPIO_OUTPUT,1) == FL_OK) ebdat7_01DebugTrace("INIT PIN_67 OK \r\n"); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gegel 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Уже писал в какой то ветке: вариантов SPI множество и абсолютно нецелесообразно вводить в EAT готовые функции. Гораздо лучше было бы иметь возможность физического доступа к ножкам, чтобы не использовать функции типа ebdat6_04WriteGpio, а непосредственно писать-читать пины. Тогда можно было бы делать быстрые реализации SPI на свой вкус, а по желанию даже использовать asm-вставки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Romashki 0 2 октября, 2012 Опубликовано 2 октября, 2012 · Жалоба Может кто сталкивался с приемом смс в ЕАТ. Отсылаю 6 символов латиницей - получаю, открываю ( ищу в строке комбинацию UNREAD\",\"), считываю в буфер номер телефона и текст смс, а вот когда отправляю около 60ти символов на русском комбинацию UNREAD\",\" вообще не находит и выдает обрывок окончания смс (выходит из прерывания по default). Такое чувство что модем длину выдает полученных данных (flEventBuffer.eventData.modemdata_evt.length), а сам буфер еще не заполняет (flEventBuffer.eventData.modemdata_evt.data)..... Может кто поборол эту проблему..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться