Peavy (6-1) held the Cubs to four hits and struck out six as he moved into a tie for the NL lead in wins and lowered his league-leading ERA to 1.63.
"He competes as well as anyone I've seen," Cubs manager Lou Piniella said. "He's got good stuff to go along with it."
Kevin Kouzmanoff and Adrian Gonzalez also homered for the Padres, who hit as many as four homers in a home game for the fifth time since Petco Park opened in 2004. All four came against Rich Hill (4-4), who has lost four of five decisions since opening the season 3-0.
Peavy retired his final nine batters, but came out after throwing 98 pitches -- 30 of those coming in the first inning, when Chicago scored its only run.
"I could have gone longer," he said. "But with our bullpen, and I'm pitching Sunday against Milwaukee, I think it was a good decision."
Trevor Hoffman recorded two outs for his 12th save, and 494th of his career as the Padres remained a half-game behind the first-place Los Angeles Dodgers in the NL West.
The Padres came right back and tied it on Gonzalez's RBI single in their half of the first.
Only two Chicago batters reached base in Peavy's final five innings: Cesar Izturis singled in the second inning, and Floyd led off the fourth with a double.
Kouzmanoff led off the second with an opposite-field home run to right to put San Diego ahead 2-1. Cameron and Gonzalez started the bottom of the third with back-to-back homers. Cameron homered again in his next at-bat, a solo shot with one out in the fifth that made it 5-1. After batting .192 in April, Cameron is hitting .293 with three home runs, 12 RBI and 14 runs in 19 games in May. Kouzmanoff, meanwhile, has lifted his average from .137 to .189 with an 8-for-16 performance during his five-game hitting streak.
"It's a good sign for this ballclub to add another two bats in there and put some sock in it," Cameron said.
Hill lasted six innings and allowed five runs, six hits and two walks. He struck out a season-high eight.
"It was just poor pitch selection on my part, especially to Cameron," Hill said. "I got a little stubborn trying to go back in on him after striking him out the first time."
Chicago loaded the bases with two outs against Heath Bell in the seventh, but the inning ended on Ryan Theriot's groundout. The Cubs, who have lost four or their last six, also put two runners on against Cla Meredith in the eighth and were unable to score.
Derrek Lee returned to Chicago's starting lineup for the first time since May 13, when he suffered neck spasms. He was 0-for-5 with a strikeout. "It's good to be back," he said. "I was pain-free. That was good. Hopefully, I'll swing the bat better tomorrow."
Padres shortstop Khalil Greene made a spectacular play to end the top of the fifth. He ranged to his left to grab a hard grounder up the middle off the bat of Theriot. Greene then leaped and spun in the air before making an accurate throw to first base.
"That's just a great play, as good as you'll see from a major league shortstop," Padres manager Bud Black said.
- Cameron had his first multiple-homer game since July 29, 2004, at Montreal while playing for the New York Mets. He has 11 multihomer games, including a four-homer game May 2, 2002, at the Chicago White Sox while with Seattle.
- The Padres' last four-homer game at home came last Aug. 16 in a 7-5 loss in 13 innings against San Francisco.
- San Diego has won nine of its last 10 against Chicago, including two of three this year and all seven meetings last season.