主题 : 请教Micro2440的SPI1做为Master如何设置多个从SPI设备 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 20276
精华: 0
发帖: 29
金钱: 150 两
威望: 30 点
综合积分: 58 分
注册时间: 2010-04-29
最后登录: 2021-06-25
楼主  发表于: 2011-04-22 22:31

 请教Micro2440的SPI1做为Master如何设置多个从SPI设备

请教各位老大,现在我正在做一个项目,就是用Micro的SPI1连接接3个MCP2515,现在用的内核是友善2.6.32.2,从2.6.33复制mcp2515的驱动过来,可以编译,就是probe failed。移植过程参考网上如下:

1、在配置Linux 编译选项时,开启相应的SPI 选项,如下所示
    -> Device Drivers
      -> SPI support
       SPI support
          *** SPI Master Controller Drivers ***
      -*- Bitbanging SPI master
      <*> Samsung S3C24XX series SPI
      < > Samsung S3C24XX series SPI by GPIO
          *** SPI Protocol Masters ***
      < > SPI EEPROMs from most vendors
      <*> User mode SPI device driver support
      < > Infineon TLE62X0 (for power switching)
设置完成保存。

2.驱动文件mcp251x.c mcp251x.h can.h
文件mcp251x.c放在目录drivers/net/can/下;
文件mcp251x.h放在目录include/linux/can/platform/下;

由2.6.33的文件用在2.6.32,要替换的文件有
3.添加配置文件drivers/net/can/Kconfig
在文件中添加
config CAN_MCP251X
       tristate "Microchip 251x series SPI CAN Controller"
       depends on CAN && SPI
       default N
       ---help---
         Say Y here if you want support for the Microchip 251x series of
         SPI based CAN controllers.

4.在drivers/net/can/Makefile文件中添加编译文件
obj-$(CONFIG_CAN_MCP251X)                 += mcp251x.o
  
5. 修改文件arch/arm/mach-s3c2410/mach-smdk2410.c中添加spi板级启动信息
#include <linux/spi/spi.h>
#include <mach/spi.h>       //包含s3c2410_spi_info结构体
#include <linux/can/platform/mcp251x.h>  //包含struct mcp251x_platform_data结构体

static struct mcp251x_platform_data mcp251x_info = {
        .oscillator_frequency = 12000000,
        .board_specific_setup = &mcp251x_setup,
        .power_enable = NULL,     // .power_enable = mcp251x_power_enable,
        .transceiver_enable = NULL,
};

static struct spi_board_info spi1_board_info[] = {
        [0] = {
                .modalias     = "mcp2515",
                .bus_num      = 1,
                .platform_data     = &mcp251x_info,
                .irq          = IRQ_EINT0,
                .max_speed_hz     = 10*1000*1000,
                .chip_select     = 0,
        },
        [1] = {
                .modalias     = "mcp2515",
                .bus_num      = 1,
                .platform_data     = &mcp251x_info,
                .irq          = IRQ_EINT1,
                .max_speed_hz     = 10*1000*1000,
                .chip_select     = 1,
        },
        [2] = {
                .modalias     = "mcp2515",
                .bus_num      = 1,
                .platform_data     = &mcp251x_info,
                .irq          = IRQ_EINT2,
                .max_speed_hz     = 10*1000*1000,
                .chip_select     = 2,
        },
        [3] = {
                .modalias     = "mcp2515",
                .bus_num      = 1,
                .platform_data     = &mcp251x_info,
                .irq          = IRQ_EINT3,
                .max_speed_hz     = 10*1000*1000,
                .chip_select     = 3,
        }
};

static struct s3c2410_spi_info spi1_platdata = {
                .pin_cs = S3C2410_GPC(8),     //我猜是指上面第一个片选对应的片选引脚,chip_select为0就对应S3C2410_GPC(8),不知对不对
                .num_cs = 4,     /* 这个应该是代表slave数量 */
                .bus_num = 1,
};

smdk2410_devices数组中添加
&s3c_device_spi0,
smdk2410_init函数中添加
s3c_device_spi1.dev.platform_data= &spi1_platdata;
spi_register_board_info(spi1_board_info, ARRAY_SIZE(spi1_board_info));

问题:
查看<mach/spi.h> ,我觉得是tatic struct s3c2410_spi_info spi1_platdata赋值上有问题,但网上例子都是只对应一个从设备,没讲多个从设备如果切换片选,不知是不是自己写一个片选切换函数赋值到truct s3c2410_spi_info 的void (*set_cs)(struct s3c2410_spi_info *spi, int cs, int pol);,但cs跟pol是什么意思又不明确。
所以请各位高手指点一下,谢谢。
级别: 新手上路
UID: 20276
精华: 0
发帖: 29
金钱: 150 两
威望: 30 点
综合积分: 58 分
注册时间: 2010-04-29
最后登录: 2021-06-25
1楼  发表于: 2011-04-22 22:32
smdk2410_devices数组中添加
&s3c_device_spi1,     // 上面笔误
级别: 新手上路
UID: 39631
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
综合积分: 20 分
注册时间: 2011-03-10
最后登录: 2011-09-20
2楼  发表于: 2011-09-16 09:22

 回 1楼(ewew9527) 的帖子

请问问题是怎样解决的??我遇到了同样的问题!!!