Ссылки:
https://www.linux.com/learn/tutorials/746860-how-to-access-chips-over-the-spi-on-beaglebone-black
http://stackoverflow.com/questions/23691084/reading-sensor-with-spi
http://hipstercircuits.com/enable-spi-with-device-tree-on-beaglebone-black-copy-paste/
1. Смотрим в таблицу, видим, что можно использовать SPI0 и SPI1 на разъеме P9 (p9.28, p9.29, p9.30, p9.31) beagleboneblack. На всякий случай напомню у меня
root@beaglebone:/lib/firmware# uname -a
Linux beaglebone 3.8.13 #1 SMP Wed Sep 4 09:09:32 CEST 2013 armv7l GNU/Linux
SPI0 я откинул, так как он закроет мне UART2.
Итак, привет SPI1.
2. Ну, в папке /dev/ нет ничего что бы называлось хоть как то близко к spi.
Делаем все как в 3ей ссылке, и вот облом не выходит:
Start nano
nano BB-SPI1-01-00A0.dts
Copy-paste this into the file:
/dts-v1/;
/plugin/;
/ {
compatible = "ti,beaglebone", "ti,beaglebone-black";
/* identification */
part-number = "BB-SPI1-01";
/* version */
version = "00A0";
/* state the resources this cape uses */
exclusive-use =
/* the pin header uses */
"P9.31",
"P9.29",
"P9.30",
"P9.28",
"P9.13",
"P9.12",
"spi1";
fragment@0 {
target = <&am33xx_pinmux>;
__overlay__ {
pinctrl_spi1: pinctrl_spi1_pins {
pinctrl-single,pins = <
0x190 0x13 /* P9_31 = mcasp0_aclkx.spi1_sclk , OUTPUT_PULLUP | MODE3 */
0x194 0x33 /* P9_29 = mcasp0_fsx.spi1_d0 , INPUT_PULLUP | MODE3 */
0x198 0x13 /* P9_30 = mcasp0_axr0.spi1_d1 , OUTPUT_PULLUP | MODE3 */
0x19c 0x13 /* P9_28 = mcasp0_ahclkr.spi1_cs0 , OUTPUT_PULLUP | MODE3 */
0x164 0x12 /* P9_42 = GPIO0_7 = eCAP0_in_PWM0_out.gpio0[7] , OUTPUT_PULLUP | MODE2 */
>;
};
};
};
fragment@1 {
target = <&spi1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <0>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1>;
cs-gpios = <&gpio4 17 0>, <&gpio1 7 0>;
spi1_0{
#address-cells = <1>;
#size-cells = <0>;
compatible = "spidev";
reg = <0>;
spi-max-frequency = <16000000>;
spi-cpha;
};
spi1_1{
#address-cells = <1>;
#size-cells = <0>;
compatible = "spidev";
reg = <1>;
spi-max-frequency = <16000000>;
// Mode 0 (CPOL = 0, CPHA = 0)
};
};
};
};
Close the file (Ctrl-o, Ctrl-x) and compile using dtc:
dtc -O dtb -o BB-SPI1-01-00A0.dtbo -b 0 -@ BB-SPI1-01-00A0.dts
Then, copy the file into /lib/firmware/:
cp BB-SPI1-01-00A0.dtbo /lib/firmware/
Then enable the device tree overlay:
echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots
root@beaglebone:/dev# echo BB-SPI1-01 > /sys/devices/bone_capemgr.8/slots
-sh: echo: write error: File exists
Вобщем почитал http://stackoverflow.com/questions/17707987/beaglebone-linux-issues-appending-a-line-to-a-file написано что SPI1 не может одновременно работать s HDMI. Я это уже видел много раз, но надеялся что пронесет. Чтож, читаем как отключтьб HDMI...
3. HDMI turn off
root@beaglebone:/dev# cat /sys/devices/bone_capemgr.*/slots
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART1
8: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART2
9: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART4
mount /dev/mmcblk0p1 /mnt/card
nano /mnt/card/uEnv.txt
мой файл:
optargs=quiet drm.debug=7
Пишем
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
Перезагружаемся
root@beaglebone:~# cat /sys/devices/bone_capemgr.*/slots
0: 54:PF---
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI
6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BB-BONELT-HDMIN
7: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART1
8: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART2
9: ff:P-O-L Override Board Name,00A0,Override Manuf,BB-UART4
root@beaglebone:~# echo BB-SPI1-01 > /sys/devices/bone_capemgr.8/slots
-sh: echo: write error: File exists
Хм...
Итог.
Вроде получилось, я попробовал сделать все то же с spi0 вышло, spi1 ну никак. В итоге просто сделал строку в файле uEnv.txt
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=BB-SPI0-01,BB-SPI1-01
и появилось три файла в папке /dev/
root@beaglebone:~# ls /dev/spi*
/dev/spidev1.0 /dev/spidev2.0 /dev/spidev2.1
root@beaglebone:~#
Код:
static const char *spi_name = "/dev/spidev2.0";
uint32_t readMAX(int spiDev)
{
struct spi_ioc_transfer xfer;
char rxBuffer[8];
uint32_t data= 0;
int res=0;
xfer.rx_buf = (unsigned long)rxBuffer;
xfer.len = 8;
xfer.speed_hz = 100000;
xfer.cs_change = 1;
xfer.bits_per_word = 4;
xfer.delay_usecs= 10;
while( 1){
res = ioctl(spiDev, SPI_IOC_MESSAGE(1), &xfer);
usleep(100000);
}
int main() {
int spiDev = open(spi_name, O_RDWR);
readMAX(spiDev);
Ногами дергает, прием не проверял пока
Прием на втором порте не работал. Исправился:
Кажется, вопрос решился. Точно не уверен, тестирую.
По умолчанию, в папке /lib/firmware были файлы
BB-SPI0-01-00A0.dtbo
BB-SPI1-01-00A0.dtbo
Поэтому uEnv.txt я написал:
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=BB-SPI0-01,BB-SPI1-01
При старте либо создавалось 3 файла в папке /dev/
spidev1.0
spidev2.0
spidev2.1
И второй порт лагал, либо один файл
spidev1.0
Я, следуя инструкции по включению, сделал три новых файла
BB-SPIDEV0-00A0.dts
BB-SPIDEV1-00A0.dts
BB-SPIDEV1A1-00A0.dts, получил из них *.dtbo
и переписал строку uEnv
optargs=quiet capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=BB-SPIDEV0,BB-SPIDEV1
При первом включении создалось
root@beaglebone:~# ls /dev/sp*
/dev/spidev1.0 /dev/spidev1.1 /dev/spidev2.0 /dev/spidev2.1
И второй порт заработал нормально. В чем причина такого поведения, не знаю. Стабильность появления второго порта после перезагрузки буду проверять
|