织梦成品网站,南京seo网站优化,杭州做网站seo,在临沂做网站最近在搞单片机和A5S的SPI通信 1、A5S是跑的是ITRON的系统、有自己相关的SPI API函数2、单片机这边也是可以熟悉了#xff0c;发送#xff0c;接收什么的#xff0c;我都可以自模拟出来3、但是问题是#xff0c;A5S上面的API函数的工作是如何的#xff0c;我一直没怎么弄清…最近在搞单片机和A5S的SPI通信
1、A5S是跑的是ITRON的系统、有自己相关的SPI API函数2、单片机这边也是可以熟悉了发送接收什么的我都可以自模拟出来3、但是问题是A5S上面的API函数的工作是如何的我一直没怎么弄清楚4、一般的SPI通信不都是主机提供时钟信号吗可是我用A5S发送数据的时候用示波器量时钟引脚并没有看到有方波5、不知所解呀最后发现在CSDN上发帖子发完之后总是不记得自己有发过而且不知道在哪里找回来最后面自己搜索出来了http://bbs.csdn.net/topics/390437622?page1#post-394425594//今天在我的系统上验证了那几个API函数、发关的时候我用示波器去查看MOSI引脚发现有输出、这让我感到非常的高兴然后再用示波器去测了一下SCL引脚发现SCL引脚竟然是低电平一点反应都没有查了一下资料有些资料上写着SPI发送的时候应该会进行如下几个步骤、 1、首先初始化一些什么寄存器呀设置是发送多少位什么的还有设置是低位先发送还是高位先发送 2、然后把数据填写到发送的buffer里面去 3、发送buffer里面的数据把数据一位一位的移到MOSI上面去、实际上就是一个移位寄存器的原理 4、发送完成 后面我再测了一下EN脚发现EN脚一直都是高电平、不过这里可以理解可以理解成高电平使能发送 还有我用串口打印了一下发送的那个API函数返回的值是0说明是这个函数已经成功执行了。 如果是这样的话那我从机要如何接收呢主机没有发送时钟信号没有时钟信号是如何发送的然后从 机要如何搞真的是太不可理解了 #define MCU_SPI_EN GPIO(91)
#define MCU_SPI_MISO GPIO(90)
#define MCU_SPI_MOSI GPIO(89)
#define MCU_SPI_SCL GPIO(88)#define MCU_SPI_ID 1
#define MCU_SPI_MODE SPI_MODE3
#define MCU_SPI_DFS 0x8 //full-duplex
#define MCU_SPI_BAUD_RATE 500000 //500000void rtc_mcu_spi_init(void)
{printk(---------rtc_mcu_spi_init--------------\n);#if 0gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MISO, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MOSI, GPIO_FUNC_SW_OUTPUT);gpio_config(MCU_SPI_SCL, GPIO_FUNC_SW_INPUT);gpio_set(MCU_SPI_EN);gpio_clr(MCU_SPI_SCL);gpio_set(MCU_SPI_MISO);gpio_set(MCU_SPI_MOSI);#endifspi2_config(0, MCU_SPI_MODE, MCU_SPI_DFS, MCU_SPI_BAUD_RATE);//spi_config_ena_pin_polarity(SPI_MASTER2, 0, SPI_CS_POL_HIGH);
}void rtc_mcu_spi_handler(int eid)
{u16 reg[2];u16 ID0xAAAA;unsigned char Flag0;//reg[0]0xaa55;//reg[1]0xaa55;//Flagspi2_write(MCU_SPI_ID, reg, 2);Flagspi2_write_read(MCU_SPI_ID, ID, reg ,1, 2);printk(reg[0]-reg[1]:%x, %x\n,reg[0],reg[1]);if(Flag0){printk(a5sspi_write_success----------\n);}else{printk(a5sspi_write_fail-------------\n);}
} 之前用示波器查看那四个引脚老是有问题今天借了另一块板子来试了一下才知道原来是我的板子有问题现此对安霸公司说声抱歉你们的系统还是可以用的片选 线没有波形时钟线的数据线有波形、后面我做了如下的修正可以用示波器看到片选信号的波形了#define MCU_SPI_EN GPIO(91)
#define MCU_SPI_MISO GPIO(90)
#define MCU_SPI_MOSI GPIO(89)
#define MCU_SPI_SCL GPIO(88)#define MCU_SPI_ID 0 //spi2_config 对应的是SPI的第二个接口了但是SPI的第二个接口只能接一个SPI从设备所以把这里改为0而不是1#define MCU_SPI_MODE SPI_MODE0
#define MCU_SPI_DFS 0x77 //0x8 //full-duplex
#define MCU_SPI_BAUD_RATE 50000 //500000void rtc_mcu_spi_init(void)
{printk(---------rtc_mcu_spi_init--------------\n);#if 0gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MISO, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MOSI, GPIO_FUNC_SW_OUTPUT);gpio_config(MCU_SPI_SCL, GPIO_FUNC_SW_INPUT);gpio_set(MCU_SPI_EN);gpio_clr(MCU_SPI_SCL);gpio_set(MCU_SPI_MISO);gpio_set(MCU_SPI_MOSI);#endif//gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_OUTPUT);//gpio_set(MCU_SPI_EN);spi2_config(MCU_SPI_ID, MCU_SPI_MODE, MCU_SPI_DFS, MCU_SPI_BAUD_RATE);//spi_config_ena_pin_polarity(SPI_MASTER2, 1, 0);
}void rtc_mcu_spi_handler(int eid)
{u16 reg[2];u16 ID0x0AB1;unsigned char Flag1;reg[0]0xaa55;reg[1]0xaa55;//gpio_clr(MCU_SPI_EN);//Flagspi2_write(MCU_SPI_ID, reg, 2);Flagspi2_write_read(MCU_SPI_ID, ID, reg ,1, 2);//gpio_set(MCU_SPI_EN);printk(reg[0]-reg[1]:%x, %x\n,reg[0],reg[1]);if(Flag0){printk(a5sspi_write_success----------\n);}else{printk(a5sspi_write_fail-------------\n);}
} 从这图里看出来黄色的线就是SPI的片选使能线我从A5S发送的是write_read的函数这个函数的话是先写再读的所以写和读的中间有一个高电平的脉冲~我又来了今天可恶的灰熊拿下了雷霆不喜欢他是因为他们淘汰了保罗好了不说了说下正事SPI的全双工工作模式这里指的是用一个时钟可以完成发送和接收一起的工作比如8个时钟可以同时进行发送和接收因为发送和接收的引脚是不一样的这里已经进行过验证下面贴出我今天调试出的通信先从A5S发命令到单片机然后单片机判断收到的是不是正确的再回发消息给A5S代码如下单片机部分#ifndef _SPI_
#define _SPI_
//--------------------------------------------------------------
#define Master_SDO_DAT _pa5 //DEFINE SDI PIN
#define Master_SDO_DATC _pac5 //DEFINE SDI CONTROL BIT#define Master_SDI_DAT _pa6 //DEFINE SDI PIN
#define Master_SDI_DATC _pac6 //DEFINE SDI CONTROL BIT#define Master_SCK _pa7 //DEFINE SDI PIN
#define Master_SCKC _pac7 //DEFINE SDI CONTROL BIT#define Master_SPIEN _pb5 //??SPI?????????
#define Master_SPIENC _pbc5 //EN?????
//--------------------------------------------------------------void SPI_INIT(void);void MCUSPI_WRITE(unsigned char senddat);unsigned char MCUSPI_READE(void);#endif datMCUSPI_READE();if(dat0x7E){MCUSPI_WRITE(0xa9);}else{MCUSPI_WRITE(dat);} void SPI_INIT(void)
{//MCU做从机的配置Master_SPIENC1;Master_SDO_DATC0;Master_SDO_DAT0;Master_SDI_DATC1;Master_SCKC1;
}
void MCUSPI_WRITE(unsigned char senddat)
{unsigned char i;if(!Master_SPIEN){for(i0;i8;i){ Master_SDO_DAT senddat0x80;while(Master_SCK);while(!Master_SCK); senddat 1;}}
}
unsigned char MCUSPI_READE(void)
{unsigned char R_Dat;unsigned char i;//循环用到的变量Master_SDO_DAT0;if(0Master_SPIEN){for(i0;i8;i){ //if(0i){ while(!Master_SCK); } R_Dat | Master_SDI_DAT; if(i7){ while(Master_SCK); while(!Master_SCK);} R_Dat 1;//接收数据变量 }}return R_Dat;
} A5S部分#define MCU_SPI_EN GPIO(91)
#define MCU_SPI_MISO GPIO(90)
#define MCU_SPI_MOSI GPIO(89)
#define MCU_SPI_SCL GPIO(88)#define MCU_SPI_ID 0
#define MCU_SPI_MODE SPI_MODE0
#define MCU_SPI_DFS 0x77 //0x77//0x8 //full-duplex
#define MCU_SPI_BAUD_RATE 50000 //500000void rtc_mcu_spi_init(void)
{printk(---------rtc_mcu_spi_init--------------\n);#if 0gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MISO, GPIO_FUNC_SW_INPUT);gpio_config(MCU_SPI_MOSI, GPIO_FUNC_SW_OUTPUT);gpio_config(MCU_SPI_SCL, GPIO_FUNC_SW_INPUT);gpio_set(MCU_SPI_EN);gpio_clr(MCU_SPI_SCL);gpio_set(MCU_SPI_MISO);gpio_set(MCU_SPI_MOSI);#endif//gpio_config(MCU_SPI_EN, GPIO_FUNC_SW_OUTPUT);//gpio_set(MCU_SPI_EN);spi2_config(MCU_SPI_ID, MCU_SPI_MODE, MCU_SPI_DFS, MCU_SPI_BAUD_RATE);//spi_config_ena_pin_polarity(SPI_MASTER2, 1, 0);
}void rtc_mcu_spi_handler(int eid)
{u8 reg;u8 ID0x7E;unsigned char Flag1;Flagspi2_write_read(MCU_SPI_ID, ID, ® ,1, 1);printk(reg[0]-reg[1]:%x,\n,reg);if(Flag0){printk(a5sspi_write_success----------\n);}else{printk(a5sspi_write_fail-------------\n);}
} //weiqifartc_mcu_spi_init();app_timer_register(TIMER_1HZ, rtc_mcu_spi_handler);printk(mcu_spi\n);