最近玩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, ini
tialize 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);
}
}
}