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 }
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; }
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 }
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 }
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; } }
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; }
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; }
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; }
static void init_TM1616(void) { GPIO_set(); }
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]); }