搜索
bottom↓
回复: 5

求STC 15F2K32S2单片机 SPI 转 双串口芯片CH432T 的驱动程序

[复制链接]

出0入0汤圆

发表于 2015-10-16 14:32:27 | 显示全部楼层 |阅读模式
本人最近在用单片机做个东西,但是串口不够用,找了很久,发现CH432T这个芯片能把单片机的spi口转为串口使用,但是由于没有什么经验,所以求各大神STC 15F2K32S2单片机 SPI 转 双串口芯片CH432T 的驱动程序

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2015-10-16 14:35:01 | 显示全部楼层
附上嵌入式linux spi转CH432驱动,不知道这个和单片机的有什么区别呢?


#include <stdio.h>

#include <stdint.h>

#include <stdlib.h>

#include <getopt.h>

#include <unistd.h>

#include <sys/ioctl.h>

#include <fcntl.h>

#include <termios.h>

#include <string.h>

#include <linux/types.h>

#include "appspi.h"

#include "spidev.h"

#include "log/log.h"

#include "ch432.h"

#include "include/basetype.h"



static int fd_spi[MAXNUM_SPI] = {-1, -1};

static uint8_t mode=SPI_MODE_0;

static uint8_t bits = 8;

static uint32_t speed = 24000000;



#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))



#define  SIZE_APPSPI_RCVBUF     1024

struct appspi_rcvst

{

    char buf[SIZE_APPSPI_RCVBUF];

    int len;

    int head;

};

static struct appspi_rcvst appspi_rcvbuf[MAXNUM_SPI];

int appspi_open(unsigned int port)

{

    int fd;

    char dev[32];

    int ret;

    if(-1 != fd_spi[port])

        close(fd_spi[port]);



    if(port==0) sprintf(dev, "/dev/spidev0.0");

    else if(port==1) sprintf(dev, "/dev/spidev0.1");

    fd = open(dev, O_RDWR);

    if(fd<0)

    {

        printf("can't open spi device");

        return 1;

    }

    print_log(LOGLVL_DEBUG,"open spi port=%d\n",port);

    ret = ioctl(fd, SPI_IOC_WR_MODE,&mode);

    if (ret == -1)

        print_log(LOGLVL_ERROR,"can't set spi mode");



    ret = ioctl(fd, SPI_IOC_RD_MODE,&mode);

    if (ret == -1)

        print_log(LOGLVL_ERROR,"can't get spi mode");



    /*

     * bits per word

     */

    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);

    if (ret == -1)

        print_log(LOGLVL_ERROR,"can't set bits per word");



    ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);

    if (ret == -1)

        print_log(LOGLVL_ERROR,"can't get bits per word");



    /*

     * max speed hz

     */

    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);

    if (ret == -1)

        print_log(LOGLVL_ERROR,"can't set max speed hz");



    ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);

    if (ret == -1)

        print_log(LOGLVL_ERROR,"can't get max speed hz");



    print_log(LOGLVL_DEBUG,"spi mode: %d\n", mode);

    printf("bits per word: %d\n", bits);

    printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

    fd_spi[port]=fd;

    appspi_rcvbuf[port].len=0;

    return 0;

}

void appspi_close(unsigned int port)

{

    if((port >= MAXNUM_SPI) || (-1 == fd_spi[port]))

        return;



    close(fd_spi[port]);

    fd_spi[port] = -1;

}

int appspi_send(unsigned int port, UCHAR *buf, unsigned int len)

{

    // int i;

    int ret;

    int fd;

    if(port >= MAXNUM_SPI)

        return -1;

    fd = fd_spi[port];

    if(fd < 0)

    {

        appspi_open(port);

        fd = fd_spi[port];

        if(fd<0)

            return -1;

    }

    struct spi_ioc_transfer xfer[1];



    memset(xfer, 0, sizeof(xfer));



    xfer[0].tx_buf = (__u64)(int) buf;

    xfer[0].len = len;



    ret = ioctl(fd, SPI_IOC_MESSAGE(1), xfer);

    if (ret < 0)

    {

        print_log(LOGLVL_ERROR,"Error: SPI_IOC_MESSAGE\n");

        return -1;

    }

    return ret;

}



int appspi_recv(unsigned int port,UCHAR addr, UCHAR *buf, unsigned int len)

{

    // int i;

    int ret;

    int fd;

    UCHAR tx[32];

   // UCHAR *bp;

    if(port>= MAXNUM_SPI)

        return -1;

    fd = fd_spi[port];

    if(fd < 0)

    {

        appspi_open(port);

        fd = fd_spi[port];

        if(fd<0)

            return -1;

    }

    struct spi_ioc_transfer xfer[2];

    memset(xfer, 0, sizeof(xfer));

    tx[0]=addr;

    xfer[0].tx_buf =(__u64)(int)tx;

    xfer[0].len = 1;



    xfer[1].rx_buf =(__u64)(int) buf;

    xfer[1].len =len;

    ret = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);

    if (ret < 0)

    {

        print_log(LOGLVL_ERROR,"Error: SPI_IOC_MESSAGE\n");

        return -1;

    }

    return ret;

}



int appspi_getfd(unsigned int port)

{

    if(port >= MAXNUM_SPI)

        return -1;

    return(fd_spi[port]);

}



void writeCH432Data(unsigned int port,UCHAR mAddr,UCHAR dat)

{

    UCHAR buf[2];

    mAddr=(mAddr<<2)|0x02;

    buf[0]=mAddr;

    buf[1]=dat;

    appspi_send(port,buf,2);

}

void WriteCH432Block(unsigned int port,UCHAR mAddr,int len,UCHAR *dat)

{

    while(len--)

    {

        writeCH432Data(port,mAddr,*dat++);

    }

}



unsigned char ReadCH432Data(unsigned int port,UCHAR mAddr)

{

    unsigned char recvdata=0;

    int ret;

    mAddr=(mAddr<<2)&0xFD;

    // appspi_send(port,&mAddr,1);

    ret=appspi_recv(port,mAddr,&recvdata,1);

    return(recvdata);

}

出0入0汤圆

发表于 2015-10-16 15:02:13 | 显示全部楼层
STC有四串口的,还不够用?SPI通信很简单的了,自己写不行?

出0入0汤圆

 楼主| 发表于 2015-10-16 15:17:21 | 显示全部楼层
rain73 发表于 2015-10-16 15:02
STC有四串口的,还不够用?SPI通信很简单的了,自己写不行?

我刚出道,对单片机了解有限,而且我们这边板子已经做好了,用的不是四串口的单片机,而是用CH432T来扩展串口,我也是没办法啊

出0入0汤圆

发表于 2015-10-16 19:10:22 | 显示全部楼层
MC-26 发表于 2015-10-16 15:17
我刚出道,对单片机了解有限,而且我们这边板子已经做好了,用的不是四串口的单片机,而是用CH432T来扩展 ...

这样别人很难帮到你,除非以前做过类似的例程。
要不你发块板过来,我帮你写出来?呵呵

出0入0汤圆

 楼主| 发表于 2015-10-19 11:18:11 | 显示全部楼层
rain73 发表于 2015-10-16 19:10
这样别人很难帮到你,除非以前做过类似的例程。
要不你发块板过来,我帮你写出来?呵呵 ...

这个是我们的电路图,您就帮我看看,写个简单的收、发示例程序吧,谢谢了!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表