天线|RF射频
直播中

李晔皓

7年用户 175经验值
私信 关注
[问答]

24L01 51程序移植到stm8不成功的原因是什么?怎么解决?

最近玩stm8,想把24L01的程序移植到stm8. 把引脚定义好,程序基本没有变化,程序可以在51运行,但是在stm8上却不行,  后来直接写寄存器后在读,还是不成功,这里请问大家 51向stm8 移植  应注意什么问题,下面附上程序   看看是哪里的问题,谢谢大家





#include "IOSTM8S103F3.h"



/************************I/O口定义********************************/

#define LED   PB_ODR_ODR5



#define CSN   PB_ODR_ODR4



#define SCK   PC_ODR_ODR3

#define MOSI  PC_ODR_ODR4

#define MISO  PC_IDR_IDR5

//#define IRQ   PC_IDR_IDR6

#define CE    PC_ODR_ODR7



void Delay(unsigned int x)

{

  unsigned int i,j;

  for(i=x; i>0; i--)

  {

    for(j=110; j>0; j--)

    {

      ++j;

      --j;

    }

  }

}



void InerDelay_us(unsigned char n)

{

  for(;n>0;n--)

  {

     ++n;

     --n;

  }

}



unsigned char SPI_RW(unsigned char uuchar)

{

    unsigned char bit_ctr;

    for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit

    {

      MOSI = (uuchar & 0x80)>>7;           // output 'uchar', MSB to MOSI

      uuchar = (uuchar << 1);           // shift next bit into MSB..

      SCK = 1;                      // Set SCK high..

      //Delay(1);                          /*****************/

      uuchar |= MISO;           // capture current MISO bit

      SCK = 0;                // ..then set SCK low again

      //Delay(1);                       /*************************/

    }

    return(uuchar);               // return read uchar

}



unsigned char SPI_Read(unsigned char reg)

{

  unsigned char reg_val;



  CSN = 0;                // CSN low, initialize SPI communication...

  SPI_RW(reg);            // Select register to read from..

  reg_val = SPI_RW(0);    // ..then read registervalue

  CSN = 1;                // CSN high, terminate SPI communication



  return(reg_val);        // return register value

}











unsigned char SPI_RW_Reg(unsigned char reg, unsigned char value)

{

  unsigned char status;



  CSN = 0;      // CSN low, init SPI transaction

  InerDelay_us(10);

  status = SPI_RW(reg);      // select register

  SPI_RW(value);             // ..and write value to it..

  CSN = 1;                   // CSN high again

   

  return(status);            // return nRF24L01 status uchar

}





void Init_GPIO(void)

{

  //#define LED   PB_ODR_ODR5



//#define CSN   PB_ODR_ODR4

//#define SCK   PC_ODR_ODR3

//#define MOSI  PC_ODR_ODR4

//#define MISO  PC_IDR_IDR5

//#define IRQ   PC_IDR_IDR6

//#define CE    PC_ODR_ODR7



       PB_DDR_DDR5 = 1;

       PB_DDR_DDR4 = 1;

       PB_CR1 = 0xff;

       PB_CR2 = 0x00;

      

       PC_DDR_DDR3 = 1;

       PC_DDR_DDR4 = 1;

       PC_DDR_DDR5 = 0;

       PC_DDR_DDR6 = 0;

       PC_DDR_DDR7 = 1;

       PC_CR1      = 0xff;

       PC_CR2      = 0x00;

}      



void Init_Cloc(void)

{

   CLK_ICKR|=0x01;      //开启内部HSI

   while(!(CLK_ICKR&0x02));//HSI准备就绪

   CLK_SWR=0xe1;        //HSI为主时钟源

   CLK_CKDIVR=0x18;     //HSI   8 分频  2M  

}



int main(void)

{

  Init_Cloc();

  

  Init_GPIO();

  LED = 1;

  CE=0;   

  CSN=1;  

  SCK=0;



  SPI_RW_Reg(0x20 + 0x06, 0x07);    //0x20是读寄存器    0x06寄存器地址   

  while(1)

  {

   

    if(SPI_Read(0x06) == 0x07)                      //查看是否发送成功

    {

       LED = 0;

       Delay(600);

       LED = 1;     

       Delay(600);            

    }

  

  }



}

回帖(2)

许朝亮

2020-4-23 09:33:18


谢谢站长!   我的问题找到了,弄了好长时间才找到,是杜邦线的问题,杜邦线这东西不靠谱,程序没有问题,不过我把分频都调到了最大值。
举报

冯琳

2020-4-23 09:39:00
帮顶。。。。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分