|
|
  |
Для "Peps" и остальных кто пользуется ЕАТ - исправления. |
|
|
|
Aug 16 2012, 07:47
|
Местный
  
Группа: Участник
Сообщений: 209
Регистрация: 5-12-10
Пользователь №: 61 419

|
Вроде бы получилось написать свои функции 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[i]); /* 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[i]=read_byte(); while(ebdat6_04WriteGpio(EEPROM_SELECT,1)!=FL_OK); } //******************************************************************
Можно даже без ebdat05_09delay(10);
|
|
|
|
|
Oct 2 2012, 12:49
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 7-06-12
Из: Севастополь, Россия
Пользователь №: 72 202

|
Вот и мне пришлось вплотную использовать 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");
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|