Навошта выконваць бітаў аперацыі тут? (SPI FRAM метад чытання)

См: https://github.com/adafruit/Adafruit_FRAM_SPI/blob/master/Adafruit_FRAM_SPI .cpp Наступны метад счытвае і пераўтворыць ўваходныя дадзеныя ў 8 біт. У мяне ёсць некалькі пытанняў, якія тычацца яго функцыі.

Выкарыстоўваючы ADDR = 0xFFFF у якасці прыкладу, спосаб пераўтворыць пераменны ў 0xFF. Я разумею, што біты выдаляюцца з канца, але, безумоўна, 65535! = 255. Можа быць, адносна таго, каб іх максімальны памер, але як гэта карысна пераўтварэнні? Я мог бы быць нешта адсутнічае аб пабітавае тут ..

uint8_t Adafruit_FRAM_SPI::read8 (uint16_t addr)
{
 digitalWrite(_cs, LOW);
 SPItransfer(OPCODE_READ); //read memory from fram array (2-byte)
 SPItransfer((uint8_t)(addr >> 8));
 SPItransfer((uint8_t)(addr & 0xFF));
 uint8_t x = SPItransfer(0);
 digitalWrite(_cs, HIGH);
 return x;
}

Папраўце мяне, калі я памыляюся, кастынг, каб знакавая узнікнення.

Маскіроўка я разумею ў тэорыі, але не зусім разумею, яго прымяненне тут.

Нарэшце, ён заўсёды вяртае тое ж значэнне х = 0, то чаму?

Я таксама бачу, што ёсць спосаб запісу, але не метад чытання. Толькі read8. Разважаючы?

1
Код вышэй першага адправіць найвышэйшыя 8 біт адрасу ( 'код> адр >> 8 ), а затым самыя нізкія 8 біт. Не ведаю, чаму яны робяць як маскіроўку і ліцця. Пасля гэтага ён пасылае 8 нулявых бітаў. Падчас адпраўкі гэтых біт Фрам паслаць значэнне ў звароце да штыфта arduinos MISO. 8-бітнае значэнне захоўваецца ў `х зменнай. Звярніце ўвагу, што SPI з'яўляецца двунаправленным, і вы можаце адпраўляць і атрымліваць дадзеныя адначасова.
дададзена аўтар Al., крыніца
Падумайце аб тым, што адбываецца з лікамі, а затым падлучыць тыя ў 4 перадачы SPI і думаць пра тое, што на самой справе тое адбываецца на шыне SPI.
дададзена аўтар Majenko, крыніца

1 адказы

Давайце выкажам здагадку, што адр гэта 0xbeef . Тады, калі мы разбіваем кожную аперацыю:

expression             │ value
───────────────────────┼───────
addr                   │ 0xbeef
addr >> 8              │ 0x00be
(uint8_t)(addr >> 8)   │   0xbe
addr & 0xFF            │ 0x00ef
(uint8_t)(addr & 0xFF) │   0xef

Так што гэта, па сутнасці, разбіўшы адрас на два 8-бітавых порцый, і перадача гэтых блокаў у паасобку. Гэта зроблена так, таму што SPI перадае толькі байты.

<�Р> кастынг, каб знакавая узнікнення.

Non, знакавая пашырэнне не можа адбыцца, так як адр гэты лік без знака. Адліўка сапраўды не служыць ніякай карыснай мэты, акрамя дакументавання код. Гэта будзе зроблена няяўна проста таму, што SPItransfer() прымае элемент uint8_t аргумент. Ліцця можа быць карысна, калі SPItransfer() быў перагружаны з 16-разраднай версіі.

<�Р> Нарэшце, ён заўсёды вяртае тое ж значэнне х = 0, то чаму?

Не, яна вяртае то выклік SPItransfer (0); вяртаецца, г.зн. дадзеныя, якія перадаюцца з дапамогай модуля FRAM.

3
дададзена