Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

это у меня есть. вот модуль для работы с ММС - может, пригодится

Отправлено ыфефт 31 марта 2007 г. 20:20
В ответ на: Спешл фор Satan :) отправлено UraGun 31 марта 2007 г. 19:58

//MMC parameters/definitions/functions/////////////////////////////////////////////////////////////////////////////////

/** \addtogroup params_mmc MMC
*/

//MMC commands by number
#define mmc_cmd_0 0
#define mmc_cmd_1 1
#define mmc_cmd_2 2
#define mmc_cmd_3 3
#define mmc_cmd_4 4
#define mmc_cmd_5 5
#define mmc_cmd_6 6
#define mmc_cmd_7 7
#define mmc_cmd_8 8
#define mmc_cmd_9 9
#define mmc_cmd_10 10
#define mmc_cmd_11 11
#define mmc_cmd_12 12
#define mmc_cmd_13 13
#define mmc_cmd_14 14
#define mmc_cmd_15 15
#define mmc_cmd_16 16
#define mmc_cmd_17 17
#define mmc_cmd_18 18
#define mmc_cmd_19 19
#define mmc_cmd_20 20
#define mmc_cmd_21 21
#define mmc_cmd_22 22
#define mmc_cmd_23 23
#define mmc_cmd_24 24
#define mmc_cmd_25 25
#define mmc_cmd_26 26
#define mmc_cmd_27 27
#define mmc_cmd_28 28
#define mmc_cmd_29 29
#define mmc_cmd_30 30
#define mmc_cmd_31 31
#define mmc_cmd_32 32
#define mmc_cmd_33 33
#define mmc_cmd_34 34
#define mmc_cmd_35 35
#define mmc_cmd_36 36
#define mmc_cmd_37 37
#define mmc_cmd_38 38
#define mmc_cmd_39 39
#define mmc_cmd_40 40
#define mmc_cmd_41 41
#define mmc_cmd_42 42
#define mmc_cmd_43 43
#define mmc_cmd_44 44
#define mmc_cmd_45 45
#define mmc_cmd_46 46
#define mmc_cmd_47 47
#define mmc_cmd_48 48
#define mmc_cmd_49 49
#define mmc_cmd_50 50
#define mmc_cmd_51 52
#define mmc_cmd_52 52
#define mmc_cmd_53 53
#define mmc_cmd_54 54
#define mmc_cmd_55 55
#define mmc_cmd_56 56
#define mmc_cmd_57 57
#define mmc_cmd_58 58
#define mmc_cmd_59 59
#define mmc_cmd_60 60
#define mmc_cmd_61 61
#define mmc_cmd_62 62
#define mmc_cmd_63 63

//MMC commands by name
//Basic commands & read stream commands (class 0 and class 1)
#define mmc_cmd_GO_IDLE_STATE mmc_cmd_0 /**< \brief resets all cards to idle state \ingroup params_mmc */
#define mmc_cmd_SEND_OP_COND mmc_cmd_1 /**< \brief asks all cards in idle state to send their operation conditions register contents in the response on the CMD line \ingroup params_mmc */
#define mmc_cmd_ALL_SEND_CID mmc_cmd_2 /**< \brief asks all cards to send their CID numbers on the CMD line \ingroup params_mmc */
#define mmc_cmd_SET_RELATIVE_ADDR mmc_cmd_3 /**< \brief assigns relative address to the card \ingroup params_mmc */
#define mmc_cmd_SET_DSR mmc_cmd_4 /**< \brief programs the DSR of all cards \ingroup params_mmc */
#define mmc_cmd_SELECT_DESELECT_CARD mmc_cmd_7 /**< \brief command toggles a card between the stand-by and transfer states or between the programming and disconnect states. In both cases the card is selected by its own relative address and gets deselected by any other address; address 0 deselects \ingroup params_mmc */
#define mmc_cmd_SEND_CSD mmc_cmd_9 /**< \brief addressed card sends its card-specific data (CSD) on the CMD line \ingroup params_mmc */
#define mmc_cmd_SEND_CID mmc_cmd_10 /**< \brief addressed card sends its card identification (CID) on CMD the line \ingroup params_mmc */
#define mmc_cmd_READ_DAT_UNTIL_STOP mmc_cmd_11 /**< \brief reads data stream from the card, starting at the given address, until a STOP_TRANSMISSION follows \ingroup params_mmc */
#define mmc_cmd_STOP_TRANSMISSION mmc_cmd_12 /**< \brief forces the card to stop transmission \ingroup params_mmc */
#define mmc_cmd_SEND_STATUS mmc_cmd_13 /**< \brief addressed card sends its status register \ingroup params_mmc */
#define mmc_cmd_GO_INACTIVE_STATE mmc_cmd_15 /**< \brief sets the card to inactive state in order to protect the card stack against communication breakdowns \ingroup params_mmc */
//Block oriented read commands (class 2)
#define mmc_cmd_SET_BLOCKLEN mmc_cmd_16 /**< \brief sets the block length (in bytes) for all following block commands (read and write). Default block length is specified in the CSD \ingroup params_mmc */
#define mmc_cmd_READ_SINGLE_BLOCK mmc_cmd_17 /**< \brief reads a block of the size selected by the SET_BLOCKLEN command \ingroup params_mmc */
#define mmc_cmd_READ_MULTIPLE_BLOCK mmc_cmd_18 /**< \brief continuously transfers data blocks from card to host until interrupted by a stop command or the requested number of data block transmitted \ingroup params_mmc */
//Stream write commands (class 3)
#define mmc_cmd_WRITE_DAT_UNTIL_STOP mmc_cmd_20 /**< \brief writes data stream from the host, starting at the given address, until a STOP_TRANSMISSION follows \ingroup params_mmc */
//Block oriented write commands (class 4)
#define mmc_cmd_SET_BLOCK_COUNT mmc_cmd_23 /**< \brief Defines the number of blocks which are going to be transferred in the immediately succeeding multiple block read or write command \ingroup params_mmc */
#define mmc_cmd_WRITE_BLOCK mmc_cmd_24 /**< \brief writes a block of the size selected by the SET_BLOCKLEN command \ingroup params_mmc */
#define mmc_cmd_WRITE_MULTIPLE_BLOCK mmc_cmd_25 /**< \brief continuously writes blocks of data until a STOP_TRANSMISSION follows or the requested number of block received \ingroup params_mmc */
#define mmc_cmd_PROGRAM_CID mmc_cmd_26 /**< \brief programming of the card identification register. This command shall be issued only once per card. The card contains hardware to prevent this operation after the first programming. Normally this command is reserved for the manufacturer \ingroup params_mmc */
#define mmc_cmd_PROGRAM_CSD mmc_cmd_27 /**< \brief programming of the programmable bits of the CSD \ingroup params_mmc */
//Block oriented write protection commands (class 6)
#define mmc_cmd_SET_WRITE_PROT mmc_cmd_28 /**< \brief if the card has write protection features, this command sets the write protection bit of the addressed group. The properties of write protection are coded in the card specific data (WP_GRP_SIZE) \ingroup params_mmc */
#define mmc_cmd_CLR_WRITE_PROT mmc_cmd_29 /**< \brief if the card provides write protection features, this command clears the write protection bit of the addressed group \ingroup params_mmc */
#define mmc_cmd_SEND_WRITE_PROT mmc_cmd_30 /**< \brief if the card provides write protection features, this command asks the card to send the status of the write protection bits \ingroup params_mmc */
//Erase commands (class 5)
#define mmc_cmd_TAG_SECTOR_START mmc_cmd_32 /**< \brief sets the address of the first sector of the erase group \ingroup params_mmc */
#define mmc_cmd_TAG_SECTOR_END mmc_cmd_33 /**< \brief sets the address of the last sector in a continuous range within the selected erase group, or the address of a single sector to be selected for erase \ingroup params_mmc */
#define mmc_cmd_UNTAG_SECTOR mmc_cmd_34 /**< \brief Removes one previously selected sector from the erase selection \ingroup params_mmc */
#define mmc_cmd_ERASE_GROUP_START mmc_cmd_35 /**< \brief sets the address of the first erase group within a range to be selected for erase \ingroup params_mmc */
#define mmc_cmd_ERASE_GROUP_END mmc_cmd_36 /**< \brief sets the address of the last erase group within a continuous range to be selected for erase \ingroup params_mmc */
#define mmc_cmd_UNTAG_ERASE_GROUP mmc_cmd_37 /**< \brief Removes one previously selected erase group from the erase selection \ingroup params_mmc */
#define mmc_cmd_ERASE mmc_cmd_38 /**< \brief erases all previously selected write blocks \ingroup params_mmc */
//I/O mode commands (class 9)
#define mmc_cmd_FAST_IO mmc_cmd_39 /**< \brief used to write and read 8 bit (register) data fields. The command addresses a card and a register and provides the data for writing if the write flag is set. The R4 response contains data read from the addressed register. This command accesses application dependent registers which are not defined in the MultiMediaCard standard \ingroup params_mmc */
#define mmc_cmd_GO_IRQ_STATE mmc_cmd_40 /**< \brief Sets the system into interrupt mode \ingroup params_mmc */
//Lock card (class 7)
#define mmc_cmd_LOCK_UNLOCK mmc_cmd_42 /**< \brief Used to set/reset the password or lock/unlock the card. The size of the data block is set by the SET_BLOCK_LEN command \ingroup params_mmc */
//Application specific commands (class 8)
#define mmc_cmd_APP_CMD mmc_cmd_55 /**< \brief Indicates to the card that the next command is an application specific command rather than a standard command \ingroup params_mmc */
#define mmc_cmd_GEN_CMD mmc_cmd_56 /**< \brief Used either to transfer a data block to the card or to get a data block from the card for general purpose / application specific commands. The size of the data block shall be set by the SET_BLOCK_LEN command \ingroup params_mmc */
#define mmc_cmd_READ_OCR mmc_cmd_58 /**< \brief read OCR register \ingroup params_mmc */
#define mmc_cmd_CRC_ON_OFF mmc_cmd_59 /**< \brief turns the CRC option on or off. A ‘1’ in the CRC option bit will turn the option on, a ‘0’ will turn it off \ingroup params_mmc */

//MMC responses
//R1 response bits
#define mmc_r1_NOERROR 0 /**< \brief No errors occured \ingroup params_mmc */
#define mmc_r1_IDLE_STATE 1 /**< \brief In idle state - The card is in idle state and running the initializing process \ingroup params_mmc */
#define mmc_r1_ERASE_RESET 2 /**< \brief Erase reset - An erase sequence was cleared before executing because an out of erase sequence command was received \ingroup params_mmc */
#define mmc_r1_ILLEGAL_COMMAND 4 /**< \brief Illegal command - An illegal command code was detected \ingroup params_mmc */
#define mmc_r1_COMMAND_CRC_ERROR 8 /**< \brief Communication CRC error - The CRC check of the last command failed \ingroup params_mmc */
#define mmc_r1_ERASE_SEQUENCE_ERROR 16 /**< \brief Erase sequence error - An error occurred in the sequence of erase commands \ingroup params_mmc */
#define mmc_r1_ADDRESS_ERROR 32 /**< \brief Address error - A misaligned address, which did not match the block length, was used in the command \ingroup params_mmc */
#define mmc_r1_PARAMETER_ERROR 64 /**< \brief Parameter error - The command’s argument (for example, address, block length) was out of the allowed range for this card \ingroup params_mmc */

//R2 response bits
#define mmc_r2_NOERROR 0 /**< \brief No errors occured \ingroup params_mmc */
#define mmc_r2_CARD_LOCKED 1 /**< \brief Card is locked - This bit is set when the card is locked by the user. It is reset when it is unlocked. \ingroup params_mmc */
#define mmc_r2_WP_ERASE_SKIP 2 /**< \brief wp erase skip | lock/unlock command failed - Write protect erase skip|lock/unlock command failed—This status bit has two functions. It is set when the host attempts to erase a write-protected sector or if a sequence or password error occurred during a card lock/unlock operation. \ingroup params_mmc */
#define mmc_r2_ERROR 4 /**< \brief Error — A general or an unknown error occurred during the operation \ingroup params_mmc */
#define mmc_r2_CC_ERROR 8 /**< \brief CC error — Internal card controller error \ingroup params_mmc */
#define mmc_r2_ECC_FAILED 16 /**< \brief Card ECC failed — Card internal ECC was applied but failed to correct the data \ingroup params_mmc */
#define mmc_r2_WP_VIOLATION 32 /**< \brief Write protect violation — The command tried to write a write-protected block \ingroup params_mmc */
#define mmc_r2_ERASE_PARAM 64 /**< \brief Erase param — An invalid selection, sectors or groups, for erase \ingroup params_mmc */
#define mmc_r2_OUT_OF_RANGE 128 /**< \brief Out of range|csd_overwrite — This status bit has two functions. It is set if the command argument was out of its valid range, or if the host is trying to change the ROM section or reverse the copy bit (set asoriginal) or permanent WP bit (un-protect) of the CSD register \ingroup params_mmc */
#define mmc_r2_CSD_OVERWRITE 128 /**< \brief Out of range|csd_overwrite — This status bit has two functions. It is set if the command argument was out of its valid range, or if the host is trying to change the ROM section or reverse the copy bit (set asoriginal) or permanent WP bit (un-protect) of the CSD register \ingroup params_mmc */

//Data block token
#define mmc_data_token_SINGLE_BLOCK_READ 0xfe /**< \brief starting token of SINGLE_BLOCK_READ \ingroup params_mmc */
#define mmc_data_token_MULTIPLE_BLOCK_READ 0xfe /**< \brief starting token of data MULTIPLE_BLOCK_READ \ingroup params_mmc */
#define mmc_data_token_SINGLE_BLOCK_WRITE 0xfe /**< \brief starting token of SINGLE_BLOCK_WRITE \ingroup params_mmc */
#define mmc_data_token_MULTIPLE_BLOCK_WRITE_START 0xfc /**< \brief starting token of MULTIPLE_BLOCK_WRITE \ingroup params_mmc */
#define mmc_data_token_MULTIPLE_BLOCK_WRITE_STOP 0xfd /**< \brief ending token of MULTIPLE_BLOCK_WRITE \ingroup params_mmc */

//Data read response token
#define mmc_data_rd_response_mask 0x1f /**< \brief bits mask of data read response \ingroup params_mmc */
#define mmc_data_rd_response_ERROR 1 /**< \brief Error — A general or an unknown error occurred during the operation \ingroup params_mmc */
#define mmc_data_rd_response_CC_ERROR 2 /**< \brief CC error — Internal card controller error \ingroup params_mmc */
#define mmc_data_rd_response_ECC_FAILED 4 /**< \brief Card ECC failed — Card internal ECC was applied but failed to correct the data \ingroup params_mmc */
#define mmc_data_rd_response_OUT_OF_RANGE 8 /**< \brief Out of range|csd_overwrite — This status bit has two functions. It is set if the command argument was out of its valid range, or if the host is trying to change the ROM section or reverse the copy bit (set asoriginal) or permanent WP bit (un-protect) of the CSD register \ingroup params_mmc */
#define mmc_data_rd_response_CARD_LOCKED 16 /**< \brief Card is locked - This bit is set when the card is locked by the user. It is reset when it is unlocked. \ingroup params_mmc */

//Data write response token
#define mmc_data_wr_response_mask 0x1f /**< \brief bits mask of data response \ingroup params_mmc */
#define mmc_data_wr_response_DATA_ACCEPTED 0x5 /**< \brief data accepted \ingroup params_mmc */
#define mmc_data_wr_response_DATA_REJECTED_CRC 0xb /**< \brief data rejected due to a CRC error \ingroup params_mmc */
#define mmc_data_wr_response_DATA_REJECTED_WR 0xd /**< \brief data rejected due to a write error \ingroup params_mmc */

//Operations timeouts
#define mmc_timeout_init 250 /**< \brief MMC initialization timeout, ms \ingroup params_mmc */
#define mmc_timeout_read 200 /**< \brief MMC data read timeout, ms \ingroup params_mmc */
uint8_t mmc_timeout; /**< \brief ==1 if was MMC operation timeout \ingroup params_mmc */
uint8_t mmc_timeout_cnt; /**< \brief MMC operation timeout counter \ingroup params_mmc */

/** process MMC operation timeout macro*/
#define inc_mmc_timeout_process \
if (mmc_timeout_cnt) \
{mmc_timeout_cnt--; \
if (mmc_timeout_cnt == 0) \
{mmc_timeout = 1; \
} \
}

#define crc7_mmc_start_value 0 /**< \brief starting value of MMC CRC7 \ingroup params_mmc */

/** \brief updates MMC CRC7 value crc_old with data \ingroup params_mmc */
uint8_t crc7_mmc_upd(uint8_t data, uint8_t crc_old)
{uint8_t cnt_bits;
for (cnt_bits = 8; cnt_bits; cnt_bits--)
{crc_old <<= 1;
if (((crc_old & 0x80) ) ^ ((data & 0x80))) crc_old ^= 0x9;
data <<= 1;
}
return(crc_old & 0x7f);
}

#define crc16_mmc_start_value 0 /**< \brief starting value of MMC CRC16 \ingroup params_mmc */

/** \brief updates MMC CRC16 value crc_old with data \ingroup params_mmc */
uint16_t crc16_mmc_upd(uint8_t data, uint16_t crc_old)
{uint8_t cnt_bits, flag_xor;
for (cnt_bits = 8; cnt_bits; cnt_bits--)
{flag_xor = ((crc_old >> 8) & 0x80) ^ (data & 0x80);
data <<= 1;
crc_old <<= 1;
if (flag_xor) crc_old ^= 0x1021;
}
return(crc_old);
}

#if (defined use_mmc_spi) || (defined __DOXYGEN__)
/** \brief Process MMC command cmd with parameter param, returns operation result or 0xFF if no response received \ingroup params_mmc */
uint8_t mmc_spi_cmd(uint8_t cmd, uint32_t param)
{uint8_t ui8_01, ui8_02;
ui8_02 = crc7_mmc_start_value; //initialize CRC7
spi_txrx8(0xff); //extra 8 clocks
ui8_01 = 0x40 | cmd; spi_txrx8(ui8_01); //send start bit, transmission bit, 6 command index bits
ui8_02 = crc7_mmc_upd(ui8_01, ui8_02); //update CRC7
ui8_01 = param >> 24; spi_txrx8(ui8_01); //send MSB of argument
ui8_02 = crc7_mmc_upd(ui8_01, ui8_02); //update CRC7
ui8_01 = param >> 16; spi_txrx8(ui8_01); //send next argument byte
ui8_02 = crc7_mmc_upd(ui8_01, ui8_02); //update CRC7
ui8_01 = param >> 8; spi_txrx8(ui8_01); //send next argument byte
ui8_02 = crc7_mmc_upd(ui8_01, ui8_02); //update CRC7
ui8_01 = param; spi_txrx8(ui8_01); //send LSB of argument byte
ui8_02 = crc7_mmc_upd(ui8_01, ui8_02); //update CRC7
spi_txrx8((ui8_02 << 1) | 1); //send CRC7 bits with Stop bit
//wait for R1 response
for (ui8_01=8; ui8_01; ui8_01--)
{ui8_02 = spi_txrx8(0xff);
if (ui8_02 != 0xff) break;
}
return(ui8_02);
}

/** \brief Initialize MMC \ingroup params_mmc */
uint8_t mmc_spi_init(void)
{uint8_t u8_01;
spi_unsel(); //SPI CS=1
//starting pulses SCK
for (u8_01 = 10; u8_01; u8_01--) spi_txrx8(0xff);
spi_sel(); //SPI CS=0
//CMD0
//do {u8_01 = mmc_spi_cmd(mmc_cmd_GO_IDLE_STATE, 0);} while ((u8_01!=0) && (!mmc_timeout));
mmc_spi_cmd(mmc_cmd_GO_IDLE_STATE, 0);
//initialize operation timeout counter
mmc_timeout = 0;// mmc_timeout_cnt = mmc_timeout_init;
//wait until CMD1 response == 1
do {u8_01 = mmc_spi_cmd(mmc_cmd_SEND_OP_COND, 0);} while ((u8_01!=0) && (!mmc_timeout));
//on timeout return 0xff
if (mmc_timeout) u8_01 = 0xff;
return(u8_01);
}

/** \brief wait and read data block - returns 0xff if no response, mmc_data_token_SINGLE_BLOCK_READ - normal, 0 if CRC16 error, or Error token response \ingroup params_mmc */
uint8_t mmc_spi_rd_block_single(uint8_t *buf, uint16_t block_size)
{uint8_t u8_01;
uint16_t crc16_01, crc16_02;
//initialize operation timeout counter
mmc_timeout = 0; mmc_timeout_cnt = mmc_timeout_read;
//wait for card response
do {u8_01 = spi_txrx8(0xff);} while ((u8_01 == 0xff)&&(mmc_timeout == 0));
if (mmc_timeout) u8_01 = 0xff; //if was timeout, return 0xff
else
{
//if received start token, read all data to buffer
if (u8_01 == mmc_data_token_SINGLE_BLOCK_READ)
{
crc16_01 = crc16_mmc_start_value; //initialize CRC16 of data block
while (block_size)
{u8_01 = spi_txrx8(0xff);
*buf = u8_01;
//update CRC16
crc16_01 = crc16_mmc_upd(u8_01, crc16_01);
buf++;
block_size--;
}
//read CRC16 from card
crc16_02 = ((spi_txrx8(0xff) << 8) | spi_txrx8(0xff));
//compare calculated and received CRC16, return result
if (crc16_01 == crc16_02) u8_01 = mmc_data_token_SINGLE_BLOCK_READ; else u8_01 = 0;
}else
{
}
}
return(u8_01);
}

/** \brief write data block with CRC16, returns card response \ingroup params_mmc */
uint8_t mmc_spi_wr_block_single(uint8_t *buf, uint16_t block_size)
{uint8_t u8_01;
uint16_t crc16_01;
//NWR
spi_txrx8(0xff);
//send data start token
spi_txrx8(mmc_data_token_SINGLE_BLOCK_WRITE);
//initialize CRC16 of data block
crc16_01 = crc16_mmc_start_value;
//send all block
while (block_size)
{u8_01 = *buf;
spi_txrx8(u8_01);
//update CRC16 value
crc16_01 = crc16_mmc_upd(u8_01, crc16_01);
buf++;
block_size--;
}
//send CRC16
spi_txrx8(crc16_01 >> 8);
spi_txrx8(crc16_01);
//return card response
return(spi_txrx8(0xff) & mmc_data_wr_response_mask);
}

/** \brief wait for the end of write operation (returns 1 for timeout, 0 if ok) \ingroup params_mmc */
uint8_t mmc_spi_wr_wait(void)
{
while (spi_txrx8(0xff) == 0);
return(0);
}

/** \brief write data block from *buf of size data_size to MMC address data_addr, returns 0 if ok, 1 - for mmc_cmd_SET_BLOCKLEN command fail, 2 - for mmc_cmd_WRITE_BLOCK command fail, 3 - for data accept error, 0xff - for write timeout \ingroup params_mmc */
uint8_t mmc_spi_wr_block_data(uint8_t *buf, uint32_t data_addr, uint16_t data_size)
{if ((mmc_spi_cmd(mmc_cmd_SET_BLOCKLEN, data_size)) == mmc_r1_NOERROR)
{if ((mmc_spi_cmd(mmc_cmd_WRITE_BLOCK, data_addr)) == mmc_r1_NOERROR)
{if (mmc_spi_wr_block_single(buf, data_size) == mmc_data_wr_response_DATA_ACCEPTED)
{if (mmc_spi_wr_wait() == 0) return(0); //wait for the end of operation
else return(0xff);
}else return(3);
}else return(2);
}else return(1);
}

/** \brief read data block to *buf of size data_size from MMC address data_addr, returns 0 for ok, 1 - if mmc_cmd_SET_BLOCKLEN failed, 2 - if mmc_cmd_READ_SINGLE_BLOCK failed, 3 - if data read failed \ingroup params_mmc */
uint8_t mmc_spi_rd_block_data(uint8_t *buf, uint32_t data_addr, uint16_t data_size)
{if ((mmc_spi_cmd(mmc_cmd_SET_BLOCKLEN, data_size)) == mmc_r1_NOERROR)
{if ((mmc_spi_cmd(mmc_cmd_READ_SINGLE_BLOCK, data_addr)) == mmc_r1_NOERROR)
{if (mmc_spi_rd_block_single(buf, data_size) == mmc_data_token_SINGLE_BLOCK_READ) return(0);
else return(3);
}else return(2);
}else return(1);
}
#endif


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
умножьте 3 на единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru