请问我用的谷歌应用商店打不开商店到底是国内阉割版还是国际通用的完整版?

几种通信方式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
几种通信方式
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢后使用快捷导航没有帐号?
查看: 7353|回复: 3
两块STM32F4之间spi握手通信问题
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
我用两块STM32F4的SPI1双向通信,想实现主SPI发送1024个数据,从SPI收到的时候回复一个ack,主SPI收到这个ack的时候再发送1024个字节。有好几个问题想请教大侠。
首先主SPI的配置如下:GPIO_InitTypeDef GPIO_InitS& & & & SPI_InitTypeDef SPI_InitS
& & & & // enable clock for used IO pins& & & & RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);& & & & & & & & GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3;& & & & GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;& & & & GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;& & & & GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;& & & & GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;& & & & GPIO_Init(GPIOB, &GPIO_InitStruct);& & & & & & & & // connect SPI1 pins to SPI alternate function& & & & GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);& & & & GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);& & & & GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
& & & & // enable peripheral clock& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);& & & & & & & & /* configure SPI1 in Mode 0 & & & &
* CPOL = 0 --> clock is low when idle& & & &
* CPHA = 0 --> data is sampled at the first edge& & & &
*/& & & & SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullD // set to full duplex mode, seperate MOSI and MISO lines& & & & SPI_InitStruct.SPI_Mode = SPI_Mode_M& &&&// transmit in master mode, NSS pin has to be always high& & & & SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide& & & & SPI_InitStruct.SPI_CPOL = SPI_CPOL_L& && &&&// clock is low when idle& & & & SPI_InitStruct.SPI_CPHA = SPI_CPHA_1E& && &// data sampled at first edge& & & & SPI_InitStruct.SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_S // set the NSS management to internal and pull internal NSS high& & & & SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // SPI frequency is APB2 frequency / 4& & & & SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first& & & & SPI_InitStruct.SPI_CRCPolynomial = 7;& & & & SPI1->CR1 |=0x1000;& & & & SPI1->CR2 |=0x20;& & & & SPI_Init(SPI1, &SPI_InitStruct);
& & & & SPI_Cmd(SPI1, ENABLE); // enable SPI1复制代码主机的发送接收函数:uint8_t SPI1_sendrecv(uint8_t data){
& & & & SPI1->DR = // write data to be transmitted to the SPI data register& & & & while( !(SPI1->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete& & & & while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete& & & & while( SPI1->SR & SPI_I2S_FLAG_BSY ); // wait until SPI is not busy anymore& & & & return SPI1->DR; // return received data from SPI data register}复制代码主机主函数发送:
for(index_data=0;index_data<BufferSindex_data++){& && && && && &receive_data[index_data]=SPI1_sendrecv(send_data[index_data]);}printf("%s\n\r",receive_data);复制代码从机的配置:
void init_SPI1(void){& & & & GPIO_InitTypeDef GPIO_InitS& & & & SPI_InitTypeDef SPI_InitS
& & & & // enable clock for used IO pins& & & & RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);& & & & & & & & GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4 | GPIO_Pin_3;& & & & GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;& & & & GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;& & & & GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;& & & & GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;& & & & GPIO_Init(GPIOB, &GPIO_InitStruct);& & & & & & & & // connect SPI1 pins to SPI alternate function& & & & GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);& & & & GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);& & & & GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);& & & & & & & & // enable peripheral clock& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);& & & & & & & & /* configure SPI1 in Mode 0 & & & &
* CPOL = 0 --> clock is low when idle& & & &
* CPHA = 0 --> data is sampled at the first edge& & & &
*/& & & & SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullD // set to full duplex mode, seperate MOSI and MISO lines& & & & SPI_InitStruct.SPI_Mode = SPI_Mode_S& &&&// transmit in master mode, NSS pin has to be always high& & & & SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; // one packet of data is 8 bits wide& & & & SPI_InitStruct.SPI_CPOL = SPI_CPOL_L& && &&&// clock is low when idle& & & & SPI_InitStruct.SPI_CPHA = SPI_CPHA_1E& && &// data sampled at first edge& & & & SPI_InitStruct.SPI_NSS = SPI_NSS_S&&// set the NSS management to software& & & & SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;// data is transmitted MSB first& & & & SPI_InitStruct.SPI_CRCPolynomial = 7;& & & & SPI1->CR1 |=0x1000;& & & & SPI1->CR2 |=0x20;& & & & SPI_Init(SPI1, &SPI_InitStruct);
& & & & SPI_Cmd(SPI1, ENABLE); // enable SPI1}复制代码从机发送和接收函数:void SPI1_Send(uint8_t data){& & & & SPI1->DR = // write data to be transmitted to the SPI data register& & & & while( !(SPI1->SR & SPI_I2S_FLAG_TXE) ); // wait until transmit complete& & & & }
uint8_t SPI1_Receive(void){& & & & while( !(SPI1->SR & SPI_I2S_FLAG_RXNE) ); // wait until receive complete& & & & return SPI1->DR; // return received data from SPI data register}复制代码从机主函数接收:while(1){& & & & if(index_spi==BufferSize){& & & & & & & & & & & & & & & & & & & & index_spi=0;& & & & & && &&&printf("%s\n\r",receive_data);& & & & }& & & & else{& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & receive_data[index_spi]=SPI1_Receive(); & & & & & & & & SPI1_Send(receive_data[index_spi]);& & & & & & & & index_spi++;& & & & }复制代码1. 首先测试两个之间就只是双向发送和接收,接收到的结果会有一位的偏移,比如我发一段字节:Google Inc. is an American multinational
从机收到:lGoogle Inc. is an American multinationa,从机主机都是同时收发。从机收到一个字节就同时发回这个字节。然后主机收到的也是lGoogle Inc. is an American multinationa,不知道这个是不是正常的,有没有大侠能解释下这一位的偏移是怎么回事?
2. 然后加上握手部分,希望主机发完字符串然后发送无用字节并等待回复,从机收完字符串之后收无用字符并同时发出确认字节。
主机主函数发送:for(index_data=0;index_data<BufferSindex_data++){& && && && && && & receive_data[index_data]=SPI1_sendrecv(send_data[index_data]);& & & & & & & & }& && && && && &for(j=0;j<4;j++){& & & & & & & & & & & & & & & & & & & & ack_string[j]=SPI1_sendrecv(0x00);& & & & & & & & }& & & & & & & &
printf("%s\n\r",receive_data);& & & & & & & & & & & & & & & & & & & &
printf("ack string: %s\n\r",ack_string);复制代码从机主函数接收:char ack_string[4]="GOOD";while(1){& & & & if(index_spi==BufferSize){& & & & & & & & & & & & & & & & & & & & index_spi=0;& & & & & && &&&printf("%s\n\r",receive_data);& && && && && && & & & for(i=0;i<4;i++){& & & & & & & & & & & & SPI1_Receive();& & & & & & & & & & & & SPI1_Send(ack_string[i]);& & & & & && &&&}& & & & }& & & & else{& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & receive_data[index_spi]=SPI1_Receive(); & & & & & & & & SPI1_Send(receive_data[index_spi]);& & & & & & & & index_spi++;& & & & }}复制代码主机发送Google Inc. is an American multinational,
从机收到gle Inc. is an American multinational
主机收到的字符串GOODgle Inc. is an American multinationa
收到的ack string是ack string: l&&
所以结果好像是从机回复的ack主机都在下一次收数据的时候才收到了。这个也很难理解,而且我试过了不管ack设多长,主机都是后面一步才在一串数据的开头收到这段ack。
&&&&&&&&&&
在线时间66 小时
TA的帖子TA的资源
一粒金砂(高级), 积分 311, 距离下一级还需 189 积分
一粒金砂(高级), 积分 311, 距离下一级还需 189 积分
SPI数据通信实际上就是两个串行移位寄存器首尾环境在一起。数据发送同步于数据接收,也就是发完一个字节的同时也收到了一个字节。
主机的发送是启动数据传输,而从机的发送函数实际上是为下一次数据接收时准备发送数据。
你的程序是从机接收到一个字节,再返回发送,所以返回数据将必然将后移一个字节。
要使环回正确。主机应当丢弃第一次发送时收到的第一个字节。所有数据发送完成后再发一个无效数据,读取对端返回的最后一个字节。
多谢回复。那这样的话最多也就是一个字节的偏移而已吧。我问的另外一个关于握手的问题怎么解释呢,主机收到的ack回复全部都和后面的数据一起到达了,这个不是一个字节了,而是四个字节。&
在线时间1110 小时
芯币4008枚
E金币100枚
TA的帖子TA的资源
纯净的硅(初级), 积分 729, 距离下一级还需 71 积分
纯净的硅(初级), 积分 729, 距离下一级还需 71 积分
楼上说的很有道理。
在线时间7 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
回复 沙发 xg_qing 的帖子
多谢回复。那这样的话最多也就是一个字节的偏移而已吧。我问的另外一个关于握手的问题怎么解释呢,主机收到的ack回复全部都和后面的数据一起到达了,这个不是一个字节了,而是四个字节。
Powered by
逛了这许久,何不进去瞧瞧?21ic官方微信-->
后使用快捷导航没有帐号?
查看: 2925|回复: 20
arm和dsp芯片采用SPI一对多通信
&&未结帖(10)
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
我现在想用arm和dsp芯片采用SPI一对四通信,想问一下arm和dsp中SPI的片选信号您是怎么连的?大神赐教啊!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级工程师, 积分 3113, 距离下一级还需 1887 积分
中级工程师, 积分 3113, 距离下一级还需 1887 积分
主题帖子积分
专家等级:结帖率:80%打赏:0.00受赏:1.00
主题帖子积分
中级工程师, 积分 3113, 距离下一级还需 1887 积分
中级工程师, 积分 3113, 距离下一级还需 1887 积分
直连就可以了,4个单独的片选,共用SCK, MISO和MOSI。
最伟大的四个数学牛人:阿基米德, 牛顿, 欧拉, 高斯谁更牛? 我首先排除牛顿. 第一他沾了姓牛的光; 第二他竟然试图证明上帝存在,牛人不会干的.
主题帖子积分
---------------------
主题帖子积分
---------------------
专家等级:结帖率:96%打赏:0.00受赏:40.00
主题帖子积分
---------------------
主机出 4 个 IO 口, 分别控制 4 个从机的 SPI 片选信号就是了.
欢迎进入 !
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
恩,好的,我试试看,谢谢二楼三楼!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:70%打赏:126.00受赏:2926.20
主题帖子积分
lixiaoqi90129 发表于
恩,好的,我试试看,谢谢二楼三楼!
恩&&如果只是片选& &那就好办& &你完全可以用IO口模拟& &在准备发之前就使能
不行你可以用iic啊& &这个直接都可以连了& &
欢迎进入 &
& && && & TI忠诚粉丝!
H-JTAG ARM仿真器代理
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
因为我用的arm开发板是s3c6410芯片的tiny6410,dsp芯片是tms320f2812,该dsp芯片没有iic的接口。所以想用spi一对多通信
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
airwill 发表于
主机出 4 个 IO 口, 分别控制 4 个从机的 SPI 片选信号就是了.
我看您之前做过arm和dsp一对多的spi通信,我用的arm芯片是s3c6410,Linux版本是2.6.38,现在spi的驱动已经加入到内核中,arm板子/dev 下已经有spidev0和spidev1这两个设备,但是arm作为spi主机的程序不知道该怎么写,您能将arm的spi主机程序给我一份吗?或者给点儿建议也可以,菜鸟一枚,谢谢啦!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
---------------------
主题帖子积分
---------------------
专家等级:结帖率:96%打赏:0.00受赏:40.00
主题帖子积分
---------------------
& & 抱歉, 我用的 ARM 不是 是s3c6410, arm 作为spi主机, 其实就是外设的控制, 设置寄存器作为底层驱动而已. 如果不清楚的话, 可以看开发板的例程.
& & 另外, 控制多个从机, 出来要控制片选, 还需注意互斥控制就是了.
欢迎进入 !
主题帖子积分
资深技术员, 积分 372, 距离下一级还需 128 积分
资深技术员, 积分 372, 距离下一级还需 128 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:5.00
主题帖子积分
资深技术员, 积分 372, 距离下一级还需 128 积分
资深技术员, 积分 372, 距离下一级还需 128 积分
1 对 4?SPI 比较少这样用啊,我觉得可以考虑一下 SCI,如果转成 485,那是更可以多对多。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
airwill 发表于
抱歉, 我用的 ARM 不是 是s3c6410, arm 作为spi主机, 其实就是外设的控制, 设置寄存器作为底层驱动而已 ...
s3c6410可以将自己的SPIMOSI和SPIMISO直接连起来,用spidev_test.c程序自测spi功能,那tms320f2812的spi是否也可以将自己的SPIMOSI和SPIMISO直接连起来,实现自发自收呢?期待您的回复!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
---------------------
主题帖子积分
---------------------
专家等级:结帖率:96%打赏:0.00受赏:40.00
主题帖子积分
---------------------
如果是外部连接 SPIMOSI和SPIMISO 进行程序自测spi功能, 肯定是没有问题的.
不过没有看到软件的内部连接的设置功能.
tms320f2812的spi 的优势功能是支持一个 16 级的 1~16 位的收发 FIFO.
欢迎进入 !
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
airwill 发表于
如果是外部连接 SPIMOSI和SPIMISO 进行程序自测spi功能, 肯定是没有问题的.
不过没有看到软件的内部连接的 ...
现在arm外部连接 SPIMOSI和SPIMISO 进行程序自测spi成功,dsp的spi内部连接程序自测spi成功。现在有两个问题:1、我看资料理解spi通信clock polarity=0,clock phase=0时,则在主机clk上升沿时,主机SPIDAT发送数据,从机SPIDAT发送数据,在主机clk下降沿时,主机SPIDAT锁存从机发送数据(SPIMISO引脚上电平),从机SPIDAT锁存主机发送数据(SPIMOSI引脚电平),自测时,将SPIMISO和SPIMOSI连接,主机和从机发送内容不同时,而SPIMISO和SPIMOSI又是一根线,不是矛盾吗?
2、我现在的arm和dsp的spi通信,能通上,但是收到的数据不对,不知道是什么原因。程序贴上,您指点一下,谢谢!(arm收到的rx 一直为0,arm的tx为2时,dsp收4)
* SPI testing utility (using spidev driver)
* Copyright (c) 2007&&MontaVista Software, Inc.
* Copyright (c) 2007&&Anton Vorontsov &avorontsov@&
* This prog you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software F either version 2 of the License.
* Cross-compile with cross-gcc -I/path/to/cross-kernel/include
#include &stdint.h&
#include &unistd.h&
#include &stdio.h&
#include &stdlib.h&
#include &getopt.h&
#include &fcntl.h&
#include &sys/ioctl.h&
#include &linux/types.h&
#include &linux/spi/spidev.h&
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static void pabort(const char *s)
& & & & perror(s);
& & & & abort();
static const char *device = &/dev/spidev1.0&;
static uint8_t mode=0;
static uint8_t bits = 8;
static uint32_t speed =500000;
static uint16_t delay=0;
static void transfer(int fd)
& & & & uint8_t tx[1]={2};
& & & & uint8_t rx[1]={5};
& & & & struct spi_ioc_transfer tr = {
& & & & & & & & .tx_buf = (unsigned long)tx,
& & & & & & & & .rx_buf = (unsigned long)rx,
& & & & & & & & .len = ARRAY_SIZE(tx),
& & & & & & & & .delay_usecs = delay,
& & & & & & & & .speed_hz = speed,
& & & & & & & & .bits_per_word = bits,
& & & & };
& & & & ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
& & & & if (ret & 1)
& & & & & & & & pabort(&can't send spi message&);
& & & & printf(&%.2X &, rx[0]);
& & & & puts(&&);
static void print_usage(const char *prog)
& & & & printf(&Usage: %s [-DsbdlHOLC3]\n&, prog);
& & & & puts(&&&-D --device& &device to use (default /dev/spidev1.0)\n&
& & & && && &&&&-s --speed& & max speed (Hz)\n&
& & & && && &&&&-d --delay& & delay (usec)\n&
& & & && && &&&&-b --bpw& && &bits per word \n&
& & & && && &&&&-l --loop& &&&loopback\n&
& & & && && &&&&-H --cpha& &&&clock phase\n&
& & & && && &&&&-O --cpol& &&&clock polarity\n&
& & & && && &&&&-L --lsb& && &least significant bit first\n&
& & & && && &&&&-C --cs-high&&chip select active high\n&
& & & && && &&&&-3 --3wire& & SI/SO signals shared\n&);
& & & & exit(1);
static void parse_opts(int argc, char *argv[])
& & & & while (1) {
& & & & & & & & static const struct option lopts[] = {
& & & & & & & & & & & & { &device&,&&1, 0, 'D' },
& & & & & & & & & & & & { &speed&,& &1, 0, 's' },
& & & & & & & & & & & & { &delay&,& &1, 0, 'd' },
& & & & & & & & & & & & { &bpw&,& &&&1, 0, 'b' },
& & & & & & & & & & & & { &loop&,& & 0, 0, 'l' },
& & & & & & & & & & & & { &cpha&,& & 0, 0, 'H' },
& & & & & & & & & & & & { &cpol&,& & 0, 0, 'O' },
& & & & & & & & & & & & { &lsb&,& &&&0, 0, 'L' },
& & & & & & & & & & & & { &cs-high&, 0, 0, 'C' },
& & & & & & & & & & & & { &3wire&,& &0, 0, '3' },
& & & & & & & & & & & & { &no-cs&,& &0, 0, 'N' },
& & & & & & & & & & & & { &ready&,& &0, 0, 'R' },
& & & & & & & & & & & & { NULL, 0, 0, 0 },
& & & & & & & & };
& & & & & & & &
& & & & & & & & c = getopt_long(argc, argv, &D:s:d:b:lHOLC3NR&, lopts, NULL);
& & & & & & & & if (c == -1)
& & & & & & & & & & & &
& & & & & & & & switch (c) {
& & & & & & & & case 'D':
& & & & & & & & & & & & device =
& & & & & & & & & & & &
& & & & & & & & case 's':
& & & & & & & & & & & & speed = atoi(optarg);
& & & & & & & & & & & &
& & & & & & & & case 'd':
& & & & & & & & & & & & delay = atoi(optarg);
& & & & & & & & & & & &
& & & & & & & & case 'b':
& & & & & & & & & & & & bits = atoi(optarg);
& & & & & & & & & & & &
& & & & & & & & case 'l':
& & & & & & & & & & & & mode |= SPI_LOOP;
& & & & & & & & & & & &
& & & & & & & & case 'H':
& & & & & & & & & & & & mode |= SPI_CPHA;
& & & & & & & & & & & &
& & & & & & & & case 'O':
& & & & & & & & & & & & mode |= SPI_CPOL;
& & & & & & & & & & & &
& & & & & & & & case 'L':
& & & & & & & & & & & & mode |= SPI_LSB_FIRST;
& & & & & & & & & & & &
& & & & & & & & case 'C':
& & & & & & & & & & & & mode |= SPI_CS_HIGH;
& & & & & & & & & & & &
& & & & & & & & case '3':
& & & & & & & & & & & & mode |= SPI_3WIRE;
& & & & & & & & & & & &
& & & & & & & & case 'N':
& & & & & & & & & & & & mode |= SPI_NO_CS;
& & & & & & & & & & & &
& & & & & & & & case 'R':
& & & & & & & & & & & & mode |= SPI_READY;
& & & & & & & & & & & &
& & & & & & & & default:
& & & & & & & & & & & & print_usage(argv[0]);
& & & & & & & & & & & &
& & & & & & & & }
int main(int argc, char *argv[])
& & & & int ret = 0;
& & & & parse_opts(argc, argv);
& & & & fd = open(device, O_RDWR);
& & & & if (fd & 0)
& & & & & & & & pabort(&can't open device&);
& & & & /*
& & & &&&* spi mode
& & & &&&*/
& & & & ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
& & & & if (ret == -1)
& & & & & & & & pabort(&can't set spi mode&);
& & & & ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
& & & & if (ret == -1)
& & & & & & & & pabort(&can't get spi mode&);
& & & & /*
& & & &&&* bits per word
& & & &&&*/
& & & & ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
& & & & if (ret == -1)
& & & & & & & & pabort(&can't set bits per word&);
& & & & ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
& & & & if (ret == -1)
& & & & & & & & pabort(&can't get bits per word&);
& & & & /*
& & & &&&* max speed hz
& & & &&&*/
& & & & ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
& & & & if (ret == -1)
& & & & & & & & pabort(&can't set max speed hz&);
& & & & ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
& & & & if (ret == -1)
& & & & & & & & pabort(&can't get max speed hz&);
& & & & printf(&spi mode: %d\n&, mode);
& & & & printf(&bits per word: %d\n&, bits);
& & & & printf(&max speed: %d Hz (%d KHz)\n&, speed, speed/1000);
& & & & transfer(fd);
& & & & close(fd);
DSP28_sysCtrl.c
#include &DSP28_Device.h&
//---------------------------------------------------------------------------
// InitSysCtrl:
//---------------------------------------------------------------------------
// This function initializes the System Control registers to a known state.
void InitSysCtrl(void)
& &EALLOW;
// On TMX samples, to get the best performance of on chip RAM blocks M0/M1/L0/L1/H0 internal
// control registers bit have to be enabled. The bits are in Device emulation registers.
& &DevEmuRegs.M0RAMDFT = 0x0300;
& &DevEmuRegs.M1RAMDFT = 0x0300;
& &DevEmuRegs.L0RAMDFT = 0x0300;
& &DevEmuRegs.L1RAMDFT = 0x0300;
& &DevEmuRegs.H0RAMDFT = 0x0300;
& && && &&&
// Disable watchdog module
& &SysCtrlRegs.WDCR= 0x0068;
// Initalize PLL
& &SysCtrlRegs.PLLCR = 0x06;
& &// Wait for PLL to lock
& &for(i= 0; i& 5000; i++){}
// HISPCP/LOSPCP prescale register settings, normally it will be set to default values
& &SysCtrlRegs.HISPCP.all = 0x0001;
& &SysCtrlRegs.LOSPCP.all = 0x0002;& & & &
// Peripheral clock enables set for the selected peripherals.& &
& &SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
& &SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
& &SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;
// SysCtrlRegs.PCLKCR.bit.SCIENCLKB=1;
& & & & SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;//spi模块时钟使能
& & & & & & & & & & & & & & & & & & & &
DSP28_spi.c
void InitSpi(void)
& & & & // Initialize SPI-A:
& & & & & & & & // Initialize SCI-A:
& & & & EALLOW;
& & & & GpioMuxRegs.GPFMUX.all = 0x000f;
& & & & EDIS;
& & & & /* loopback0x1f& &8 bit data */
& & & & SpiaRegs.SPICCR.all = 0x07;
& & & & SpiaRegs.SPICTL.all = 0x02;//0x07
& & & & //SpiaRegs.SPIBRR = 0x7f;
& & & & SpiaRegs.SPICCR.all = 0x87;//0x9f
& & & & //PieCtrl.PIEIER6.bit.INTx1 = 1;
//& & & & PieCtrl.PIEIER6.bit.INTx2 = 1;
& & & & //tbd...
& & & & //tbd...
unsigned int Spi_TxReady(void)
& & & & if(SpiaRegs.SPISTS.bit.BUFFULL_FLAG == 1)
& & & & & & & & i = 0;
& & & & else
& & & & & & & & i = 1;
& & & & return(i);
unsigned int Spi_RxReady(void)
& & & & if(SpiaRegs.SPISTS.bit.INT_FLAG == 1)
& & & & & & & & i = 1;
& & & & else
& & & & & & & & i = 0;
& & & & return(i);& & & &
interrupt void SPIRXINTA_ISR(void);& &// SPI
interrupt void SPITXINTA_ISR(void);& & // SPI
#include &DSP28_Device.h&
unsigned int Spi_VarRx[100];
unsigned int i,j;
//interrupt void ISRSciaTx(void);
//interrupt void ISRSciaRx(void);
void main(void)
& & & & /*初始化系统*/
& & & & InitSysCtrl();
& & & & /* 关中断 */
& & & & DINT;
& & & & IER = 0x0000;
& & & & IFR = 0x0000;
& & & & /* 初始化PIE控制寄存器 */
& & & & InitPieCtrl();
& & & & /* 初始化PIE参数表 */
& & & & InitPieVectTable();& & & &
& & & & /* 初始化外设寄存器 */
& & & & InitPeripherals();
//& & & & & & init_spi();
& & & & & & for(i = 0; i & 100; i++)
& & & & & & {
& & & & & & & & & & Spi_VarRx = 0;
& & & & & & }
& & & & & & i = 0;
& & & & & & j = 0;
& & #if& & & & Spi_Int
& & & & EALLOW;& & & & // This is needed to write to EALLOW protected registers
& & & & PieVectTable.SPITXINTA = &SPITXINTA_ISR;
& & & & PieVectTable.SPIRXINTA = &SPIRXINTA_ISR;
& & & & EDIS;& &// This is needed to disable write to EALLOW protected registers
& & & & /* 设置IER寄存器 */
& & & & IER |= M_INT6;
& & & & #endif
& & & & /* 开中断 */
& & & & EINT;& &// Enable Global interrupt INTM
& & & & ERTM;& & & & // Enable Global realtime interrupt DBGM
& & & & for(;;)
& & & & & & & & if(Spi_TxReady() == 1)//发送寄存器空
& & & & & & & & {
& & & & & & & & & & & & SpiaRegs.SPITXBUF =
& & & & & & & & & & & & i++;
& & & & & & & & & & & & if(i == 100)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & i = 0;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & &
& & & & & & & & #if& & & & !Spi_Int
& & & & & & & & if(Spi_RxReady() == 1)//接收寄存器接到了
& & & & & & & & {
& & & & & & & & & & & & Spi_VarRx[j] = SpiaRegs.SPIRXBUF&0x00FF;
& & & & & & & & & & & & j++;
& & & & & & & & & & & & if(j == 100)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & j = 0;
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & & #endif
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
---------------------
主题帖子积分
---------------------
专家等级:结帖率:96%打赏:0.00受赏:40.00
主题帖子积分
---------------------
如果 clock polarity,clock phase 弄错时, 通常的出现的情况是: 收到的数据发生移1位.
比如 tx 为2时,dsp收4,就是左移1位
收到的rx 一直为0 那就不是移1位的问题, 可能是接线或设置问题了.
另外: SPIMISO和SPIMOSI连接, 只用于自测,&&对于相互通信的测试, 只能同名端口相连, 否则不仅收不到对方发出的数据了, 而且发生混乱了
欢迎进入 !
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 30, 距离下一级还需 20 积分
实习生, 积分 30, 距离下一级还需 20 积分
airwill 发表于
如果 clock polarity,clock phase 弄错时, 通常的出现的情况是: 收到的数据发生移1位.
比如 tx 为2时,dsp ...
现在arm和dsp都能收着数据,但是数据是错误的,我现在感觉可能是收发数据的左对齐右对齐有问题。我在arm和dsp中设置的一个已送序列中,移入或移出的位数为8位。写入SPIRXBUF中数据右对齐,从SPITXBUF中发送的数据要左对齐,对发送和接收的数据怎么处理才符合左对齐右对齐?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
中级技术员, 积分 222, 距离下一级还需 78 积分
中级技术员, 积分 222, 距离下一级还需 78 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 222, 距离下一级还需 78 积分
中级技术员, 积分 222, 距离下一级还需 78 积分
看看数据手册吧
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
高级技术员, 积分 630, 距离下一级还需 370 积分
高级技术员, 积分 630, 距离下一级还需 370 积分
主题帖子积分
专家等级:结帖率:76%
主题帖子积分
高级技术员, 积分 630, 距离下一级还需 370 积分
高级技术员, 积分 630, 距离下一级还需 370 积分
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
主题帖子积分
专家等级:结帖率:70%打赏:126.00受赏:2926.20
主题帖子积分
jing43 发表于
1 对 4?SPI 比较少这样用啊,我觉得可以考虑一下 SCI,如果转成 485,那是更可以多对多。 ...
SCI可以一对多吗& &&&
欢迎进入 &
& && && & TI忠诚粉丝!
H-JTAG ARM仿真器代理
主题帖子积分
主题帖子积分
专家等级:结帖率:70%打赏:126.00受赏:2926.20
主题帖子积分
lixiaoqi90129 发表于
现在arm和dsp都能收着数据,但是数据是错误的,我现在感觉可能是收发数据的左对齐右对齐有问题。我在arm ...
错误数据你看看有没有规律& & 不会是一个SPI发同时4个接收吗
欢迎进入 &
& && && & TI忠诚粉丝!
H-JTAG ARM仿真器代理
主题帖子积分
中级工程师, 积分 3825, 距离下一级还需 1175 积分
中级工程师, 积分 3825, 距离下一级还需 1175 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级工程师, 积分 3825, 距离下一级还需 1175 积分
中级工程师, 积分 3825, 距离下一级还需 1175 积分
jing43 发表于
1 对 4?SPI 比较少这样用啊,我觉得可以考虑一下 SCI,如果转成 485,那是更可以多对多。 ...
看到SCI,就触动“科研论文”这根神经!
主题帖子积分
资深技术员, 积分 372, 距离下一级还需 128 积分
资深技术员, 积分 372, 距离下一级还需 128 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:5.00
主题帖子积分
资深技术员, 积分 372, 距离下一级还需 128 积分
资深技术员, 积分 372, 距离下一级还需 128 积分
zhangmangui 发表于
SCI可以一对多吗
我是说转成 485,是可以 1 对多的。如果使用非隔离型的 485,速度还是可以的,ADM3485E 可以支持 20Mbps。不过这个是有要求的,1,一个时间只能有一个在发送,其它的都接收。2,因为所有挂在总线上的器件都能收到信息,所以每个器件要有自己的地址。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
技术奇才奖章
人才类勋章
甘甜之泉水
发帖类勋章
时间类勋章
希望之星奖章
等级类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
技术新星奖章
人才类勋章
时间类勋章
时间类勋章
时间类勋章
突出贡献奖章
等级类勋章
湍急之河流
发帖类勋章
技术高手奖章
人才类勋章
热门推荐 /5}

我要回帖

更多关于 谷歌商店打不开 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信