Перейти к содержанию
    

Для "Peps" и остальных кто пользуется ЕАТ - исправления.

Может, функция управления пинами unblocked?

Для гарантии попробуйте дергать в 0 и затем в 1 отдельными командами и считать в отдельные счетчики: посмотрим, только ли фронт или спад сбоят, или же оба.

Затем введите две задержки в 2-4 мкс между дерганьями и посмотрите результат.

В любом случае, даже если выйдете на 10 мкс периода тактового сигнала, то это вполне приемлемый результат.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде бы получилось написать свои функции 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и мне пришлось вплотную использовать 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");

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже писал в какой то ветке: вариантов SPI множество и абсолютно нецелесообразно вводить в EAT готовые функции. Гораздо лучше было бы иметь возможность физического доступа к ножкам, чтобы не использовать функции типа ebdat6_04WriteGpio, а непосредственно писать-читать пины. Тогда можно было бы делать быстрые реализации SPI на свой вкус, а по желанию даже использовать asm-вставки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто сталкивался с приемом смс в ЕАТ. Отсылаю 6 символов латиницей - получаю, открываю ( ищу в строке комбинацию UNREAD\",\"), считываю в буфер номер телефона и текст смс, а вот когда отправляю около 60ти символов на русском комбинацию UNREAD\",\" вообще не находит и выдает обрывок окончания смс (выходит из прерывания по default). Такое чувство что модем длину выдает полученных данных (flEventBuffer.eventData.modemdata_evt.length), а сам буфер еще не заполняет (flEventBuffer.eventData.modemdata_evt.data)..... Может кто поборол эту проблему.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...