Пример #1
0
int SDCard__cmd58(uint32_t *ocr) {
//     _cs = 0;
	GPIO_clear(_cs);
    int arg = 0;

    // send a command
    SPI_write(0x40 | 58);
    SPI_write(arg >> 24);
    SPI_write(arg >> 16);
    SPI_write(arg >> 8);
    SPI_write(arg >> 0);
    SPI_write(0x95);

    // wait for the repsonse (response[7] == 0)
    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
        int response = SPI_write(0xFF);
        if(!(response & 0x80)) {
            *ocr = SPI_write(0xFF) << 24;
            *ocr |= SPI_write(0xFF) << 16;
            *ocr |= SPI_write(0xFF) << 8;
            *ocr |= SPI_write(0xFF) << 0;
//            printf("OCR = 0x%08X\n", *ocr);
//             _cs = 1;
			GPIO_set(_cs);
            SPI_write(0xFF);
            return response;
        }
    }
//     _cs = 1;
	GPIO_set(_cs);
    SPI_write(0xFF);
    return -1; // timeout
}
Пример #2
0
int SDCard__write(const uint8_t *buffer, int length) {
//     _cs = 0;
	GPIO_clear(_cs);

    // indicate start of block
    SPI_write(0xFE);

    // write the data
    for(int i=0; i<length; i++) {
        SPI_write(buffer[i]);
    }

    // write the checksum
    SPI_write(0xFF);
    SPI_write(0xFF);

    // check the repsonse token
    if((SPI_write(0xFF) & 0x1F) != 0x05) {
//         _cs = 1;
		GPIO_set(_cs);
        SPI_write(0xFF);
        return 1;
    }

    // wait for write to finish
    while(SPI_write(0xFF) == 0);

//     _cs = 1;
	GPIO_set(_cs);
    SPI_write(0xFF);
    return 0;
}
Пример #3
0
int SDCard__cmd8() {
//     _cs = 0;
	GPIO_clear(_cs);

    // send a command
    SPI_write(0x40 | SDCMD_SEND_IF_COND); // CMD8
    SPI_write(0x00);     // reserved
    SPI_write(0x00);     // reserved
    SPI_write(0x01);     // 3.3v
    SPI_write(0xAA);     // check pattern
    SPI_write(0x87);     // crc

    // wait for the repsonse (response[7] == 0)
    for(int i=0; i<SD_COMMAND_TIMEOUT * 1000; i++) {
        char response[5];
        response[0] = SPI_write(0xFF);
        if(!(response[0] & 0x80)) {
                for(int j=1; j<5; j++) {
                    response[j] = SPI_write(0xFF);
                }
//                 _cs = 1;
				GPIO_set(_cs);
                SPI_write(0xFF);
                return response[0];
        }
    }
//     _cs = 1;
	GPIO_set(_cs);
    SPI_write(0xFF);
    return -1; // timeout
}
Пример #4
0
int SDCard__cmd(int cmd, int arg) {
//     _cs = 0;
	GPIO_clear(_cs);

// 	printf("SDCMD:%u ", cmd);

    // send a command
    SPI_write(0x40 | cmd);
    SPI_write(arg >> 24);
    SPI_write(arg >> 16);
    SPI_write(arg >> 8);
    SPI_write(arg >> 0);
    SPI_write(0x95);

    // wait for the repsonse (response[7] == 0)
    for(int i=0; i<SD_COMMAND_TIMEOUT; i++) {
        int response = SPI_write(0xFF);
        if(!(response & 0x80)) {
            GPIO_set(_cs);
            SPI_write(0xFF);
// 			printf(" <%u\n", response);
            return response;
        }
    }
//     printf("Timeout\n");
//     _cs = 1;
	GPIO_set(_cs);
    SPI_write(0xFF);
    return -1; // timeout
}
Пример #5
0
int SDCard_initialise_card() {
    // Set to 25kHz for initialisation, and clock card with cs = 1
    SPI_frequency(25000);
    GPIO_set(_cs);

    for(int i=0; i<16; i++) {
        SPI_write(0xFF);
    }

    // send CMD0, should return with all zeros except IDLE STATE set (bit 0)
    if(SDCard__cmd(SDCMD_GO_IDLE_STATE, 0) != R1_IDLE_STATE) {
        fprintf(stderr, "Could not put SD card in to SPI idle state\n");
        return cardtype = SDCARD_FAIL;
    }

    // send CMD8 to determine whther it is ver 2.x
    int r = SDCard__cmd8();
    if(r == R1_IDLE_STATE) {
// 		printf("Looks like a SDHC Card\n");
		return SDCard_initialise_card_v2();
    } else if(r == (R1_IDLE_STATE | R1_ILLEGAL_COMMAND)) {
		return SDCard_initialise_card_v1();
    } else {
        fprintf(stderr, "Not in idle state after sending CMD8 (not an SD card?)\n");
        return cardtype = SDCARD_FAIL;
    }
}
Пример #6
0
void SDCard_init(PinName mosi, PinName miso, PinName sclk, PinName cs)
{
  SPI_init(mosi, miso, sclk);
  GPIO_init(cs);
  GPIO_output(cs);
  GPIO_set(cs);
  _cs = cs;
}
int Lua_SetGPIO(lua_State *L)
{
    if (lua_gettop(L) >=2) {
        unsigned int channel = (unsigned int)lua_tointeger(L,1);
        unsigned int state = ((unsigned int)lua_tointeger(L,2) == 1);
        GPIO_set(channel, state);
    }
    return 0;
}
Пример #8
0
static int gpio_set_cb(const USB_Status_TypeDef status, uint32_t xferred, uint32_t remaining)
{
    (void)xferred;
    (void)remaining;

    struct usbthing_ctrl_s *ctrl = (struct usbthing_ctrl_s*)&cmd_buffer;

    uint8_t pin = ctrl->gpio_cmd.set.pin;
	bool output = (ctrl->gpio_cmd.set.level == USBTHING_GPIO_LEVEL_LOW) ? false : true;

    GPIO_set(pin, output);

    return USB_STATUS_OK;
}
Пример #9
0
int SDCard__read(uint8_t *buffer, int length) {
//     _cs = 0;
	GPIO_clear(_cs);

    // read until start byte (0xFF)
    while(SPI_write(0xFF) != 0xFE);

    // read data
    for(int i=0; i<length; i++) {
        buffer[i] = SPI_write(0xFF);
    }
    SPI_write(0xFF); // checksum
    SPI_write(0xFF);

//     _cs = 1;
	GPIO_set(_cs);
    SPI_write(0xFF);
    return 0;
}
Пример #10
0
static void init_TM1616(void)
{
	GPIO_set();
}
Пример #11
0
void gpio_set(gpio_port port, gpio_pin enable_pin, gpio_pin disable_pin) {
  GPIO_set(io_ports[port], io_pins[enable_pin], io_pins[disable_pin]);
}