È»¶ø£¬ÔÚÐí¶àÓ¦Óó¡¾°ÖУ¬Ó²¼þI2C½Ó¿ÚµÄÊýÁ¿¿ÉÄܲ»×ãÒÔÂú×ãËùÓÐÍâÉèµÄÁ¬½ÓÐèÇó
´Ëʱ£¬ÀûÓÃLinuxÄÚºËÖеÄi2c-gpioÄ£¿é£¬Í¨¹ýÁ½ÌõGPIOÏßÄ£ÄâI2C×ÜÏߣ¬³ÉΪÁËÒ»ÖÖÓÐЧµÄ½â¾ö·½°¸
±¾ÎĽ«ÉîÈë̽ÌÖÈçºÎÔÚLinux»·¾³ÏÂÀûÓÃi2c-gpioÄ£¿éÄ£ÄâI2C×ÜÏߣ¬²¢¹ÒÔØÉ豸
I2C×ÜÏß»ù´¡ I2C×ÜÏßÊÇÒ»ÖÖÓÃÓÚÁ¬½Ó΢´¦ÀíÆ÷ºÍÍⲿÉ豸µÄ´®ÐÐͨÐÅÐÒé
Ëü²ÉÓÃÁ½¸ùÏߣ¨SDAºÍSCL£©ÊµÏÖÊý¾Ý´«Ê䣬ÆäÖÐSDAΪÊý¾ÝÏߣ¬SCLΪʱÖÓÏß
I2C×ÜÏßÖ§³ÖÒ»Ö÷¶à´ÓµÄͨÐÅģʽ£¬ÇÒÿ¸öÉ豸¶¼ÓжÀÁ¢µÄµØÖ·£¬ÕâʹµÃ¶à¸öÉ豸¿ÉÒÔÔÚͬһ×ÜÏßÉϽøÐÐͨÐÅ
I2C×ÜÏß¾ßÓбê׼ģʽºÍ¿ìËÙģʽ£¬±ê׼ģʽ´«ÊäËÙÂÊΪ100kbit/s£¬¿ìËÙģʽΪ400kbit/s
ÔÚLinuxϵͳÖУ¬I2C×ÓϵͳÌṩÁËÒ»¸öͨÓõķ½·¨À´´¦ÀíI2CÉ豸µÄ¶Áд²Ù×÷
I2CÇý¶¯³ÌÐò¸ºÔð¹ÜÀíI2C×ÜÏßÉϵÄÉ豸£¬²¢ÏòÓû§¿Õ¼äÌṩ½Ó¿Ú£¬Ê¹Ó¦ÓóÌÐò¿ÉÒÔÓëI2CÉ豸½øÐÐͨÐÅ
i2c-gpioÄ£¿é½éÉÜ i2c-gpioÄ£¿éÊÇLinuxÄÚºËÖеÄÒ»¸öÄ£¿é£¬ËüÔÊÐí¿ª·¢Õßͨ¹ýGPIOÏßÄ£ÄâI2C×ÜÏß
Õâ¸öÄ£¿é¶ÔI2CÉ豸ÊÇ͸Ã÷µÄ£¬¼´¹ÒÔÚÕâÁ½ÌõGPIOÏßÉϵÄI2CÉ豸¿ÉÒÔÖ±½ÓʹÓÃLinuxÄÚºËͨÓõÄI2CÉ豸ע²á¡¢´«ÊäºÍ×¢ÏúµÈ·½·¨
ʹÓÃi2c-gpioÄ£¿éÄ£ÄâI2C×ÜÏßÐèÒªÒÔϼ¸¸ö²½Ö裺 1.È·ÈÏGPIO¿Ú¿ÉÓÃÐÔ£º ÔÚ×¢²ái2c-gpioÄ£¿éǰ£¬ÐèҪȷ±£ËùÒªÓõ½µÄÁ½¸öGPIO¿ÚûÓб»ÏµÍ³ÆäËûµØ·½ËùÕ¼ÓÃ
Õâͨ³£ÐèÒªÔÚϵͳƽ̨µÄÆô¶¯ÎļþÖУ¨Èçarch/Ŀ¼ÏµÄsetup.c»òdevices.cÎļþ£©½øÐÐÈ·ÈÏ
2.³õʼ»¯i2c-gpio½á¹¹Ì壺 i2c-gpioÄ£¿é¶¨ÒåÁËÒ»¸ö½á¹¹Ìå`i2c_gpio_platform_data`£¬ÓÃÓÚÅäÖÃI2CÄ£ÄâËùÐèµÄ¸÷ÖÖ²ÎÊý
Õâ¸ö½á¹¹Ìå°üÀ¨SDAºÍSCLµÄGPIOÒý½ÅID¡¢ÐźÅÇл»ÑÓ³Ù£¨udelay£©¡¢Ê±ÖÓÀÉ쳬ʱ£¨timeout£©µÈ
c struct i2c_gpio_platform_data { unsigned int sda_pin; unsigned int scl_pin; int udelay; int timeout; unsigned int sda_is_open_drain:1; unsigned int scl_is_open_drain:1; unsigned int scl_is_output_only:1; }; ÔÚ³õʼ»¯Õâ¸ö½á¹¹Ìåʱ£¬ÐèÒªÉèÖÃSDAºÍSCLµÄGPIOÒý½ÅID£¬ÒÔ¼°¿ÉÄܵÄudelayºÍtimeoutÖµ
Èç¹ûδÉèÖÃudelayºÍtimeout£¬i2c-gpioÄ£¿é»á×Ô¶¯Ê¹ÓÃĬÈÏÖµ
3.×¢²ái2c-gpioÉ豸£º ³õʼ»¯`i2c_gpio_platform_data`½á¹¹Ìåºó£¬ÐèÒª½«Æä×°Èë`platform_device`½á¹¹ÌåÖУ¬²¢µ÷ÓÃ`platform_device_register`º¯Êý×¢²áÕâ¸öÉ豸
c static struct platform_device i2c_device ={ .name = i2c-gpio, .id = -1, .dev ={ .platform_data = &i2c_data, // i2c_gpio_platform_data }, }; platform_device_register(&i2c_device); 4.¹ÒÔØI2CÉ豸£º ×¢²ái2c-gpioÉ豸ºó£¬ÐèÒª½«I2CÉ豸¹ÒÔØµ½ÐµÄI2C×ÜÏßÉÏ
Õâͨ³£Í¨¹ý`i2c_register_board_info`º¯ÊýʵÏÖ
c static struct i2c_board_info i2c_device¡¾¡¿= { { I2C_BOARD_INFO(device_name, i2c_device_addr),}, }; i2c_register_board_info(your_i2c_bus_id, i2c_device, ARRAY_SIZE(i2c_device)); ÔÚÕâÀ¡°device_name¡±ÊÇI2CÉ豸µÄÃû³Æ£¬¡°i2c_device_addr¡±ÊÇI2CÉ豸µÄµØÖ·£¬`your_i2c_bus_id`ÊÇÐÂ×¢²áµÄI2C×ÜÏßµÄID
5.±àдI2CÉ豸Çý¶¯³ÌÐò£º ¹ÒÔØI2CÉ豸ºó£¬ÐèÒª±àдÏàÓ¦µÄI2CÉ豸Çý¶¯³ÌÐò
Õâͨ³£°üÀ¨¶¨ÒåºÍ×¢²áI2CÉ豸£¨`i2c_client`£©ÒÔ¼°¶¨ÒåºÍ×¢²áI2CÉ豸Çý¶¯£¨`i2c_driver`£©
c static const struct i2c_device_id lis35de_id¡¾¡¿= { { lis35de, 0}, {} }; static struct i2c_driverst_lis35de_driver= { .probe =st_lis35de_probe, .remove =st_lis35de_remove, .suspend =st_lis35de_suspend, .resume =st_lis35de_resume, .id_table = lis35de_id, .driver ={ .name = lis35de, }, }; staticint __init st_lis35de_init(void){ printk(KERN_INFO st_lis35de_initn); return i2c_add_driver(&st_lis35de_driver); } ÔÚÇý¶¯³ÌÐòÖУ¬`i2c_add_driver`º¯ÊýÓÃÓÚ½«Çý¶¯³ÌÐòÌí¼Óµ½I2C×ÓϵͳÖÐ
Õâ¸öº¯Êý»á±éÀúËùÓÐI2C×ÜÏߣ¬²¢ÕÒµ½ÓëÇý¶¯³ÌÐòÆ¥ÅäµÄI2CÉ豸
Ö±½ÓÓÃGPIO¿ÚÄ£ÄâI2CʱÐòÓëi2c-gpioÄ£¿éµÄÇø±ð Ö±½ÓÓÃGPIO¿ÚÄ£ÄâI2CʱÐòÊÇÒ»ÖÖ¸üµ×²ãµÄ·½·¨£¬Ëü²»ÐèÒªÔÚϵͳÆô¶¯Ê±×¢²áI2C×ÜÏߣ¬Ö»ÐèÒªÔÚI2CÉ豸Çý¶¯Öе¥¶ÀʵÏÖ
ÕâÖÖ·½·¨Áé»îÐԸߣ¬µ«ÊµÏÖÆðÀ´Ïà¶Ô¸´ÔÓ£¬ÐèÒª¿ª·¢Õß¶ÔI2CʱÐòÓÐÉîÈëµÄÀí½â
Ïà±È֮ϣ¬i2c-gpioÄ£¿éÌṩÁËÒ»ÖÖ¸ü¼ò½à¡¢¸ü±ê×¼»¯µÄ·½Ê½À´Ä£ÄâI2C×ÜÏß
ËüÀûÓÃLinuxÄÚºËÖеÄI2C×Óϵͳ£¬Ê¹µÃI2CÉ豸µÄ×¢²á¡¢´«ÊäºÍ×¢ÏúµÈ²Ù×÷¸ü¼Ó±ã½Ý
´ËÍ⣬i2c-gpioÄ£¿é»¹Ö§³Ö¶àÖÖÅäÖÃÑ¡ÏÈçÐźÅÇл»ÑÓ³ÙºÍʱÖÓÀÉ쳬ʱµÈ£¬ÕâЩÅäÖÃÑ¡Ïî¿ÉÒÔ¸ù¾Ýʵ¼ÊÐèÒª½øÐе÷Õû
×ܽá ÔÚLinux»·¾³Ï£¬ÀûÓÃi2c-gpioÄ£¿éͨ¹ýGPIOÏßÄ£ÄâI2C×ÜÏßÊÇÒ»ÖÖÁé»îÇÒÓÐЧµÄ½â¾ö·½°¸
Ëü²»½ö¿ÉÒÔ½â¾öÓ²¼þI2C½Ó¿Ú²»×ãµÄÎÊÌ⣬»¹¿ÉÒÔÌá¸ßϵͳµÄ¿ÉÀ©Õ¹ÐÔºÍÁé»îÐÔ
ͨ¹ý±¾ÎĵĽéÉÜ£¬¶ÁÕß¿ÉÒÔÁ˽⵽ÈçºÎÔÚLinuxϵͳ