OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 25481|回复: 23

SPI NSS的设置问题,求大神帮忙

[复制链接]

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-28 16:08:48 | 显示全部楼层 |阅读模式
5金钱



1.关于硬件模式:
我的理解是只要设置SSOE,然后将主机和从机的NSS连接,就设置完毕了。是设置成这个模式后,内部主机的NSS就被拉高了,然后它还给从机的NSS发送了低电平?
2.关于软件模式:
设置CR1的SSM即可,然后设置SSI位就可以控制NSS引脚为高电平了,清零SSI位,则NSS为低电平
3.关于发送数据问题,为啥我先用从设备发送数据,然后接着主设备发送数据,可以成功通信,不是发送数据是主设备发起的吗?是主设备发送数据以后才会产生一个时钟信号,到底是怎么样的呢?不理解啊,求大神,谢谢

最佳答案

查看完整内容[请看2#楼]

1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般不用.因为这种方式只能1个SPI接1个从机,很是蛋疼. 2,软件模式就是完全软件控制SPI片选,就是一个普通IO控制,你要SPI通信之前,必须先用软件的方式,控制SPI从机的片选为低电平,然后在发送数据.发完后,拉高. 一般用这个模式,因为可以一个SPI控制N多个从机... 3,我先用从设备发送数据,请问你的设备是什么东西?能自主发送数据 ...
愈挫愈勇
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-5-28 16:08:49 | 显示全部楼层
1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般不用.因为这种方式只能1个SPI接1个从机,很是蛋疼.
2,软件模式就是完全软件控制SPI片选,就是一个普通IO控制,你要SPI通信之前,必须先用软件的方式,控制SPI从机的片选为低电平,然后在发送数据.发完后,拉高. 一般用这个模式,因为可以一个SPI控制N多个从机...
3,我先用从设备发送数据,请问你的设备是什么东西?能自主发送数据?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-28 16:19:28 | 显示全部楼层
void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft)
为啥我初始化了NSS对应的IO口,然后用上面的函数来设置NSS的电平,结果控制不了。求大神
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-28 23:04:08 | 显示全部楼层
回复【2楼】非常完美:
---------------------------------
原子哥,帮忙看看啊,真的搞不懂
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-28 23:45:08 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
就是两个SPI,SPI1和SPI2,我把SPI1作为主,另一个为从,然后我先用SPI2发送数据,然后下一句是SPI1发送数据,结果是可以收到的
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-28 23:50:16 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我下面的代码有问题吗?我用两个SPI通信,然后用DMA读取SPI2的数据,然后保存到一个数组中,然后用printf打印到串口,可是一直都是打印32个00,不知道哪里错了,请原子哥明示

u8 SPI1_Buffer_Tx[BufferSize] =  /* 定义待 SPI1 传输数据 */
{
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,
  0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,
  0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,
  0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20
};


u32 SPI1_Buffer_Rx[BufferSize];   /* 开辟内存空间待 SPI1 接收 */
u32 SPI2_Buffer_Rx[BufferSize];   /* 开辟内存空间待 SPI2 接收 */
u8 Tx_Idx = 0;   /* 发送计数变量 */
u8 Rx_Idx = 0;   /* 接收计数变量 */
vu8 k = 0 , i = 0; /* 循环计数变量 */

/* 自定义函数声明      --------------------------------------------------------*/

void RCC_Configuration(void);
void GPIO_Configuration(void);
void SPI_Configuration(void);




/*******************************************************************************
* 函数名 : main
* 函数描述    : main 函数
* 输入参数    : 无
* 输出结果    : 无
* 返回值      : 无
*******************************************************************************/

int main(void)
{
  
/* 设置系统时钟 */
RCC_Configuration();

/* 设置 GPIO 端口 */
GPIO_Configuration();

/* 设置 SPI */
SPI_Configuration();

    /* 初始化 USART */
     uart_init(9600);

    /* 延时函数初始化 */
 delay_init();

    /* LED函数初始化 */
 LED_Init();

NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
DMA1_Channel3_NVIC_Init();  //中断分组初始化

/* 设置 SPI1 为主机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI1, &SPI_InitStructure);

/* 设置 SPI2 为从机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI2, &SPI_InitStructure);


while(Tx_Idx < BufferSize)

/* 等待 SPI1 发送缓冲空 */ 
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

/* SPI1 发送数据 */  
SPI_I2S_SendData(SPI1, SPI1_Buffer_Tx[Tx_Idx++]);
     
/* 等待 SPI2 接收数据完毕 */
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);


/* 读出 SPI2 接收的数据 */ 
SPI2_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI2);

/* 等待 SPI1 接收数据完毕 */ 
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* 读出 SPI1 接收的数据 */ 
SPI1_Buffer_Rx[Rx_Idx++] = SPI_I2S_ReceiveData(SPI1);  
   }
    
  

 MYDMA_Config(DMA1_Channel3,(u32)&SPI2->DR,(u32)SPI2_Buffer_Rx,32);   
     SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Rx,ENABLE); 
 MYDMA_Enable(DMA1_Channel3);  //开启一次DMA传输

      delay_ms(100); //确保数据发送完成

printf("\r\nThe memmory has receive data below: \r\n");
for(k = 0; k < BufferSize ; k ++)
{
printf("%0.2d \r" , *(SPI2_Buffer_Rx + k));
for(i = 0 ; i < 200 ; i ++);
}
}
愈挫愈勇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-5-29 00:09:11 | 显示全部楼层
回复【5楼】非常完美:
---------------------------------
看你怎么设置了,SPI是全双工的,你发数据的同时都会受到一个数据。
另外,你用示波器自己看看波形就知道有没有SCK以及什么时候有SCK了。

 回复【6楼】非常完美:
---------------------------------
代码你自己测试慢慢调试下吧。
我没时间帮你测试,不好意思啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-29 08:49:12 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥能给我讲解原理性都是东西以后非常感谢了,原子哥那么忙,能给我解决问题都非常感激了,我再测试下代码吧,谢谢哥
愈挫愈勇
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-4-24 09:57:02 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
如果用了SPI1的通信口,又没用SPI自带的NSS引脚,通过一个普通IO控制SPI的片选信号,此时这个SPI本身的NSS引脚可以作为普通IO口去控制其它芯片吗?会不会对SPI通信有干扰啊
合肥-文盲
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-25 22:30:52 | 显示全部楼层
回复【9楼】合肥-文盲:
---------------------------------
可以的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-4-28 06:59:09 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
阿里旺旺问了张工(张洋),他说不可以啊,他说哪怕是软件模式控制NSS,这时候的NSS引进也不能解放出来作为普通IO!
合肥-文盲
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-4-28 23:16:30 | 显示全部楼层
回复【11楼】合肥-文盲:
---------------------------------
可以的,他搞错了。做普通IO是可以的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-4-29 09:41:58 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
好的 谢啦 原子哥
合肥-文盲
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-6-15
在线时间
0 小时
发表于 2015-6-15 13:40:29 | 显示全部楼层
回复【4楼】正点原子:
原子哥,如您所说的
“1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般不用.因为这种方式只能1个SPI接1个从机,很是蛋疼. ”
但是NSS管脚好像有个BUG,参考:
http://bbs.21ic.com/icview-110401-1-1.html
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-6-17 00:55:28 | 显示全部楼层
回复【14楼】lightinggoon:
---------------------------------
我也是没用过NSS的。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2014-7-16
在线时间
3 小时
发表于 2015-6-21 10:56:11 | 显示全部楼层
回复【6楼】非常完美:
---------------------------------
您好,请问您这个接收到数据全为0的问题解决了吗?我最近用STM32读取AD芯片,也是用串口打印结果,结果大多数数据都为0,偶尔有几个其它的数据。你的也是这个问题吗?
回复

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-20 20:03:12 | 显示全部楼层
NSS用软件模式来控制比较自由,硬件模式的话只要使能SPI,则无论是否发送数据NSS就会只以为低
天道酬勤
回复

使用道具 举报

35

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
476
金钱
476
注册时间
2015-12-27
在线时间
116 小时
发表于 2016-1-26 20:23:41 | 显示全部楼层
合肥-文盲 发表于 2015-4-24 09:57
回复【4楼】正点原子:
---------------------------------
如果用了SPI1的通信口,又没用SPI自带的NSS引脚 ...

你的意思是,用这个闲置的的SPI_NSS口作为普通的GPIO口去控制其他的外设对吧?例程去控制一个流水灯的点亮,是这个意思吧?
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-9-9
在线时间
6 小时
发表于 2017-1-22 13:28:03 | 显示全部楼层
正点原子 发表于 2014-5-28 16:08
1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般 ...

1,假如只有一个主机,一个从机,这种设置是不是挺好用(最起码不用关心啥时候给CS拉低或者拉高,因为我在程序中没怎么看到刻意去对CS进行操作)
2这种软件模式,可否理解为只对工作在从机模式下有效,假如设置成主机,主机并不需要片选,而从机才需要在通信是片选CS拉低,完成通信时拉高(我的理解是通过软件程序进行拉低或拉高,硬件CS不用管?)
还是没有彻底理解,不知道这样认为的是否对@正点原子
回复

使用道具 举报

14

主题

63

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2016-4-16
在线时间
62 小时
发表于 2017-3-15 21:11:54 | 显示全部楼层
正点原子 发表于 2014-5-28 16:08
1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般 ...

原子哥,这样的话是不是主机和从机都要配置为一个模式,比如硬件NSS或者软件NSS?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2017-4-20
在线时间
4 小时
发表于 2017-7-30 17:11:18 | 显示全部楼层
设置成硬件模式怎么示波器显示的不是低电平啊。是一堆峰峰值小的方波,跟时钟的波形差不多?
回复

使用道具 举报

17

主题

170

帖子

0

精华

高级会员

Rank: 4

积分
562
金钱
562
注册时间
2018-7-8
在线时间
118 小时
发表于 2018-10-6 10:20:10 | 显示全部楼层
正点原子 发表于 2014-5-28 16:08
1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般 ...

牛,非常可以的解释
回复

使用道具 举报

2

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2014-3-25
在线时间
16 小时
发表于 2018-10-9 15:40:17 | 显示全部楼层
正点原子 发表于 2014-5-28 16:08
1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般 ...

原子哥,主机从机必须都设置成一样的NSS模式吗?要么都是硬件NSS,要么都是软件NSS?
回复

使用道具 举报

41

主题

278

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2357
金钱
2357
注册时间
2019-10-29
在线时间
380 小时
发表于 2020-8-11 11:46:13 | 显示全部楼层
@正点原子 正点原子 发表于 2014-5-28 16:08
1,硬件NSS,是指SPI自动控制SPI的片选信号,发送数据的时候,输出低电平,不发送的时候,是高电平,这个模式一般 ...

原子哥  那个硬件控制NSS,我试了下,但是他每次发送一个字节后就自动拉高了,有什么方法可以采用硬件NSS控制发送多个字节的?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 07:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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