11.12.2015, 08:11
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от realid
|
Ну так по идее, если функция SD_SendStatus(&resp1) вернет SD_OK, то в resp1 будет статус. Бит READY_FOR_DATA 8-ой.
|
Да, я маску вчера неправильно накладывал.
Создал вторую функцию:
Код:
|
SDCardState SD_GetState2(void)
{
uint32_t resp1 = 0;
if(SD_Detect()== SD_PRESENT)
{
if (SD_SendStatus(&resp1) != SD_OK)
{
return SD_CARD_ERROR;
}
else
{
return (SDCardState)((resp1 ››8) & 0x03);
}
}
else
{
return SD_CARD_ERROR;
}
} |
Проверка идёт нормально. Возврат: SD_CARD_READY.
Последний раз редактировалось Vitaliki; 11.12.2015 в 08:13.
|
|
|
|
11.12.2015, 15:51
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Vitaliki маска на 1 бит а не 2
|
|
|
|
11.12.2015, 18:31
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Hives
|
Vitaliki маска на 1 бит а не 2
|
Хорошо. Значит, вот так:
Код:
|
return (SDCardState)((resp1 ›› 8) & 0x01); |
Можете пояснить. Я с такими конструкциями не работал раньше.
значит, что считываем 8-ой бит из 32, а маской выбираем количество.
Поясните этот момент, пожалуйста.
|
|
|
|
11.12.2015, 19:04
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Vitaliki
|
Хорошо. Значит, вот так:
Код:
|
return (SDCardState)((resp1 ›› 8) & 0x01); |
Можете пояснить. Я с такими конструкциями не работал раньше.
значит, что считываем 8-ой бит из 32, а маской выбираем количество.
Поясните этот момент, пожалуйста.
|
Сдвиг содержимого переменной 8 раз вправо и сброс всех не нужных битов в результате сдвига маской 0x01(операция AND), чтобы остался значащий только 1 бит.
Вообще нафиг этот сдвиг ради одного бита.
if(resp1 & 0x00000100) return SD_CARD_READY или if(resp1 & (1 ‹‹ 8 )) return SD_CARD_READY, так можно сразу проверить состояние бита, 1 или 0. Без всяких сдвигов.
Последний раз редактировалось realid; 11.12.2015 в 19:09.
|
|
|
|
11.12.2015, 19:22
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Спасибо за пояснение!
Раз 8-ой бит, тогда вот так должно быть:
Сообщение от realid
|
(resp1 & 0x00001000)
|
А зачем такие сдвиговые конструкции с маской? Где только они могут быть применимы? В примерах они встречаются. Просто для удобства, чтобы при большом количестве бит не рисовать длинную маску?
И вот ещё. Если рассмотреть Здесь, получается, что мы считываем бит 8 и 9, тогда?
Спасибо!
|
|
|
|
11.12.2015, 21:22
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Vitaliki
|
Спасибо за пояснение!
Раз 8-ой бит, тогда вот так должно быть:
|
0x00001000 это 12-тый бит. Учите матчасть
Сообщение от Vitaliki
|
А зачем такие сдвиговые конструкции с маской? Где только они могут быть применимы? В примерах они встречаются. Просто для удобства, чтобы при большом количестве бит не рисовать длинную маску?
И вот ещё. Если рассмотреть Здесь, получается, что мы считываем бит 8 и 9, тогда?
Спасибо!
|
Потому что, иногда надо выделить группу битов))
Например так (resp1 ›› 9) & 0x0F из ответа выделяется 4 бита статуса и по сути возвращается номер статуса.
Код:
|
typedef enum
{
SD_CARD_READY = ((uint32_t)0x00000001),
SD_CARD_IDENTIFICATION = ((uint32_t)0x00000002),
SD_CARD_STANDBY = ((uint32_t)0x00000003),
SD_CARD_TRANSFER = ((uint32_t)0x00000004),
SD_CARD_SENDING = ((uint32_t)0x00000005),
SD_CARD_RECEIVING = ((uint32_t)0x00000006),
SD_CARD_PROGRAMMING = ((uint32_t)0x00000007),
SD_CARD_DISCONNECTED = ((uint32_t)0x00000008),
SD_CARD_ERROR = ((uint32_t)0x000000FF)
}SDCardState; |
По идее есть еще Idle State = 0.
|
|
|
|
12.12.2015, 13:46
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от realid
|
0x00001000 это 12-тый бит. Учите матчасть
|
А как это считается? Я всегда думал, что 2^3 = 8. Но 0x - это 16-ый тип.
Со сдвигом теперь понятно, спасибо!
|
|
|
|
12.12.2015, 14:22
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от Vitaliki
|
А как это считается? Я всегда думал, что 2^3 = 8. Но 0x - это 16-ый тип.
|
Жесть. 8-ой это значит "бит номер 8" и не забываем, что первый бит номер 0.
|
|
|
|
12.12.2015, 17:56
|
|
Частый гость
Регистрация: 23.10.2011
Сообщений: 15
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Сообщение от realid
|
Жесть. 8-ой это значит "бит номер 8" и не забываем, что первый бит номер 0.
|
Если мы рассматриваем двоичное число, тогда в этом случае:
Единица во втором бите. Значение байта = 2^2=4.
А здесь получается каждый бит сразу за 4? Я это и не могу понять.
Вы объясните, пожалуйста, как это считать.
|
|
|
|
12.12.2015, 19:33
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: STM32+SDIO+SDHC16Gb
Vitaliki либо жирный тролль либо жертва егэ. имха.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:28.
|
|