|
本帖最后由 woshilee 于 2014-12-16 19:55 编辑 5 d$ n! v# m: C/ v& G% G4 } M0的SPI终于调通了,玩儿M3,M4多了现在玩M0就有了固定的思维模式,老路走不通的话就要找它们之间的不同之处了贴上程序吧 #include "stm32f0xx.h" #include "stdio.h". p5 ~7 Y* [5 ~* s uint8_t getbyte=0;/ j" {8 Q1 e" y( h) B# A$ G+ m0 i1 C /**$ X% k$ @# B3 D# ]# b. ` * @brief Delay+ ?! d) A) W y * @param None7 V |# }0 t) H6 a * @retval None */: _+ ]9 w4 _, _' w. z: t4 a void delay1ms(unsigned int ms)! s! f% s0 [7 P+ f& P& P g# J {! Z9 Z( U# q0 w( [; ^% d: [ unsigned int i,j; for(i=0; i<ms; i++) for(j=0; j<100; j++); } /**1 @# ]" d4 |4 F' N3 u3 E- t * @brief GPIO Config * @param None * @retval None% f3 q4 r' F# J6 K */ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure;! f5 [6 R3 f# d' ^. N + D3 U! a1 o% d3 Q6 \9 Y /* Configure PA5£¬PA7 in output nopull mode */+ G8 {$ S: c J D4 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;/ M$ S( k8 k# H% @ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;6 s& m3 T- S1 B/ @: l* \5 r, G( v2 d GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;8 x, c9 v/ |: t# z4 N1 D% N+ U8 \1 ?6 ^ GPIO_Init(GPIOA, &GPIO_InitStructure); c5 j; X( P0 S0 b2 @) G. j GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;. U' N) ^2 u5 @& t M/ F; f# l GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍ츴ÓÃÊä³ö/ j* J2 G, M$ X! K! s GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//Ðü¿Õ»òÉÏÀÊäÈë# j' v+ O$ }5 T+ G9 N# e0 `- v GPIO_Init(GPIOA, &GPIO_InitStructure);2 z( {3 r, ]: Q9 k: Q9 m6 d' F 0 K/ p( J6 ~7 {) J* F: x! z 4 n/ I% G0 _- `9 B- |1 p, w GPIO_PinAFConfig(GPIOA,GPIO_PinSource4, GPIO_AF_0); GPIO_PinAFConfig(GPIOA,GPIO_PinSource5, GPIO_AF_0);, {) e. q! S8 F GPIO_PinAFConfig(GPIOA,GPIO_PinSource6, GPIO_AF_0); GPIO_PinAFConfig(GPIOA,GPIO_PinSource7, GPIO_AF_0); }. v, d; g. P# `- T6 z' H* _( B void RCC_Configuration(void)) B2 e; ^: E' @ {3 w" \& P5 B Q- I% E( p' p RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); } void SPI_Configuration(void) { SPI_InitTypeDef SPI_InitStructure;6 H! |. I+ n* }4 V: ^ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; ; Y+ u; q4 E5 W5 W: q$ J4 r SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 4 K a! z! N: B5 L* F5 W6 H SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; : q# Q) @3 l* R: U2 T9 q5 X SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; 5 o) }, m1 p( E$ d" N SPI_InitStructure.SPI_Mode = SPI_Mode_Master;* B" M6 \" z9 ^8 K SPI_Init(SPI1, &SPI_InitStructure); SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set); ! G1 X! G9 G& \+ u8 t SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF); SPI_Cmd(SPI1, ENABLE); /* SPI enable */. f- {& H! P" z& D5 @6 o5 y V }- V& b4 G: ^8 M% g( g& O- e7 G 9 i6 c6 ~/ K/ t3 I1 e' u uint8_t SPI1_ReadWriteByte(uint8_t TxData)+ Z. T0 ^7 t2 S5 q { uint8_t RxData = 0; while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //µÈ´ý·¢ËÍ»º³åÇø¿Õ SPI_SendData8(SPI1, TxData); //·¢Ò»¸ö×Ö½Ú while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); RxData = SPI_ReceiveData8(SPI1);//SPI2 //·µ»Ø½ÓÊÕµ½µÄÊý¾Ý*/ return (uint8_t)RxData; 5 I# { l4 ]6 K7 e } " o; B) K: p( P8 W0 i 1 q' }2 i! W3 O$ m; ?' N" U % i9 s$ v1 L+ L; p5 x) D int main(void) {& k" c% C6 r+ r* U3 E' v RCC_Configuration(); GPIO_Configuration();3 z' R2 Y" D4 P SPI_Configuration(); // NVIC_Configuration();1 y5 j; D$ I5 R4 H+ M+ z5 U _, v: i0 \$ w" P4 W% V while (1)" z5 W& c4 W* N) r- }* e7 _% { {+ G) U p2 W3 [2 D, ^ getbyte=SPI1_ReadWriteByte(0x55);0 Z0 H# d: ~; p! c1 P$ q6 i+ D1 X delay1ms(100);4 |4 n. y* N! Y, G: B* M8 L/ A } }7 f) S6 x! `$ Z! L 红色的语句在M3中是没有的,在M0中这个函数的定义如下:" v3 m" b P9 J; @7 R* j" H* m /** * @brief Configures the FIFO reception threshold for the selected SPI. * @param SPIx: where x can be 1 or 2 to select the SPI peripheral. * @param SPI_RxFIFOThreshold: specifies the FIFO reception threshold. * This parameter can be one of the following values: * @arg SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO $ d1 B. U, Q9 j, e2 X+ S * level is greater or equal to 1/2. ; |/ D$ t# b& z$ ? * @arg SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO * level is greater or equal to 1/4. 1 ?1 ~: Y% j1 S! K8 f * @retval None' [3 t" [! l. L) B */ void SPI_RxFIFOThresholdConfig(SPI_TypeDef* SPIx, uint16_t SPI_RxFIFOThreshold)- F5 |# q- y; d5 m/ K5 }& O6 A1 s# D { /* Check the parameters */. u4 k5 [# V; O% p assert_param(IS_SPI_ALL_PERIPH(SPIx));8 l3 D s: U, t) ?/ O5 v assert_param(IS_SPI_RX_FIFO_THRESHOLD(SPI_RxFIFOThreshold));. X h$ ^1 l( |- ~ /* Clear FRXTH bit */ SPIx->CR2 &= (uint16_t)~((uint16_t)SPI_CR2_FRXTH);; z% ]' s2 H1 z/ [ ; {# c* i7 n4 x /* Set new FRXTH bit value */6 _3 S; w; X8 L8 P4 ~0 ~) X2 a SPIx->CR2 |= SPI_RxFIFOThreshold; } 如果不加这句话的话,肯定会卡在判断RXNE位的地方,因为没有产生这个标志,如果用延时的代替的话是可以发送出去的,但是时序就会有问题,因为发送语句执行后不是立即就完成的。希望大家注意到这一点 所有SPI 数据换都通过32 位的嵌入式FIFO,设置FRXTH 位。 RXFIFO 的阈值必须和对SPIx_DR 寄存器的读访问的字长对齐比如发送的是8位的数据,就要设置SPI_RxFIFOThreshold_QF: RXNE event is generated if the FIFO *level is greater or equal to 1/4. 就是32/4=8--》1个字节) l! {# O7 o4 @7 n/ ]: B 如果发送的是16位数据就要设置SPI_RxFIFOThreshold_HF: RXNE event is generated if the FIFO *level is greater or equal to 1/2.就是 32/2=16--》2个字节& g# H( t: p1 L( g/ J7 y, } |
微信公众号
手机版
我这是应该做的,跟你比就小巫见大巫啦