Other Parts Discussed in Thread: CC2530
我搜到类似的问题,但没人解决。里面有一个链接引用,也不能访问了。只能再问一次
我想用CC2530读取CC1101的0x31寄存器(VERSION),但是逻辑分析仪的结果如下图,只返回状态码0x0F,但是不返回数据(预期0x14)

下面是CC2530的最小源文件
#include <pinDefine.h>
#include <shortTypes.h>
#include <CC1101PinDefine.h>
#include <ioCC2530.h>
#include <helpTools.h>
#define MISO P1_7 //orange
#define MOSI P1_6 //red
#define SCK P1_5 //yellow
#define CSn P1_4 //brown
#define WR_OP_S(addr) ( (addr & 0x3f) | 0x00 ) // [7, 6] = 00
#define RD_OP_S(addr) ( (addr & 0x3f) | 0x80 ) // [7, 6] = 10
void SPI_init(void){
//!UART1 use alt 2 position
PERCFG |= 0x02;
P1SEL |= 0xE0; //MISO, MOSI, SCK set to peripheral function
P1SEL &= ~0x10; //CSn, general I/O
P1DIR |= 0x70; //CSn, SCK, MOSI, set to output
P1DIR &= ~0x80; //MISO set to input
//!SPI SCK freq, clk is 32MHz, here is 1.5MHz
U1GCR |= 15;
U1BAUD |= 128;
//!SPI mode cfg
U1GCR &= ~0xC0; //!assure that CPOL/CPHA = 0
U1CSR &= ~0xA0; //!assuure that mode = 0, namely SPI mode
U1GCR |= 0x20; //!MSB
}
//by SPI, send data to CC1101
uchar SPI_send(uchar data){
U1DBUF = data; //write to send buffer
while(!(U1CSR & 0x01)); //wait for send(TX)
U1CSR &= ~0x01; //clear flag
return U1DBUF; //read receive, because SPI is full-duplex
}
uchar CC1101_ReadReg(uchar addr){
uchar value = 0x44;
CSn = 0; Delay(1);
SPI_send(RD_OP_S(addr));
value = SPI_send(0x00);
Delay(1); CSn = 1;
return value;
}
void CC1101_WriteReg(uchar addr, uchar data){
CSn = 0; Delay(1); //lower CSn
SPI_send(WR_OP_S(addr)); //write addr, here bit7 = 0 means write
SPI_send(data); //write data
Delay(1); CSn = 1; //upper CSn
}
void CC1101_SendCommand(uchar cmd){
CSn = 0; Delay(1);
SPI_send(cmd);
Delay(1); CSn = 1;
}
void CC1101_Init(void){
//hardware reset
CSn = 1; Delay(10);
CSn = 0; Delay(100);
CSn = 1; Delay(100);
//software reset
CC1101_SendCommand(CC1101_SRES);
Delay(200);
}
void CLK_init(void){
CLKCONCMD&=~0x40;
while(CLKCONSTA & 0x40);
CLKCONCMD&=~0x47;
}
void LED_Init(){
P1SEL &= ~0x03;
P1DIR |= 0x03;
LED1 = 1; LED2 = 1;
}
void LED1_blink(){
LED1 = 1; Delay(100); LED1 = 0;
}
void light_LED2(){
LED2 = 0;
}
int main(){
LED_Init();
SPI_init();
CC1101_Init();
light_LED2(); //init finish indicator
while(1){
Delay(1000);
LED1_blink(); //working indicator
CC1101_ReadReg(CC1101_VERSION);
}
}